@marinjursic/prc-linux-arm64 0.1.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/LICENSE +21 -0
- package/README.md +3 -0
- package/bin/LICENSE +21 -0
- package/bin/README.md +335 -0
- package/bin/THIRD_PARTY_NOTICES.md +74 -0
- package/bin/adapters/checkov-v3.3.8.yaml +50 -0
- package/bin/adapters/gitleaks-v8.30.0.yaml +63 -0
- package/bin/adapters/grype-v0.116.1.yaml +58 -0
- package/bin/adapters/syft-v1.51.0.yaml +54 -0
- package/bin/catalog/assertions/core-repository.yaml +625 -0
- package/bin/catalog/assertions/iac.yaml +24 -0
- package/bin/catalog/assertions/supply-chain.yaml +45 -0
- package/bin/catalog/control-contracts.json +1 -0
- package/bin/catalog/control-id-registry.json +110470 -0
- package/bin/catalog/objectives/core-repository.yaml +243 -0
- package/bin/catalog/objectives/iac.yaml +13 -0
- package/bin/catalog/objectives/supply-chain.yaml +13 -0
- package/bin/catalog/profiles/api.yaml +12 -0
- package/bin/catalog/profiles/core-repository.yaml +49 -0
- package/bin/catalog/profiles/iac.yaml +18 -0
- package/bin/catalog/profiles/kubernetes.yaml +15 -0
- package/bin/catalog/profiles/quick.yaml +27 -0
- package/bin/catalog/profiles/supply-chain.yaml +20 -0
- package/bin/docs/architecture/adapters.md +380 -0
- package/bin/docs/architecture/agent-providers.md +188 -0
- package/bin/docs/architecture/applicability.md +80 -0
- package/bin/docs/architecture/catalog-integrity.md +85 -0
- package/bin/docs/architecture/evidence-and-results.md +154 -0
- package/bin/docs/architecture/execution-plans.md +61 -0
- package/bin/docs/architecture/product-contract.md +76 -0
- package/bin/docs/architecture/publisher-trust.md +68 -0
- package/bin/docs/architecture/remediation-contract.md +113 -0
- package/bin/docs/architecture/trust-model.md +95 -0
- package/bin/docs/assets/hero.svg +37 -0
- package/bin/docs/assets/logo.svg +13 -0
- package/bin/docs/assets/production-readiness-scan-demo-poster.png +0 -0
- package/bin/docs/assets/production-readiness-scan-demo.gif +0 -0
- package/bin/docs/assets/production-readiness-scan-demo.mp4 +0 -0
- package/bin/docs/assets/social-card.png +0 -0
- package/bin/docs/assets/social-card.svg +40 -0
- package/bin/docs/checklists/00-readiness-principle.md +17 -0
- package/bin/docs/checklists/01-release-foundations.md +91 -0
- package/bin/docs/checklists/02-product-risk-architecture.md +136 -0
- package/bin/docs/checklists/03-source-build-supply-chain.md +97 -0
- package/bin/docs/checklists/04-environments-quality-experience.md +226 -0
- package/bin/docs/checklists/05-application-security.md +320 -0
- package/bin/docs/checklists/06-data-privacy-performance.md +166 -0
- package/bin/docs/checklists/07-reliability-operations.md +355 -0
- package/bin/docs/checklists/08-maintenance-vendors-compliance.md +112 -0
- package/bin/docs/checklists/09-conditional-modules.md +229 -0
- package/bin/docs/checklists/10-evidence-and-decision.md +111 -0
- package/bin/docs/engineering/00-overview.md +51 -0
- package/bin/docs/engineering/01-governance-and-foundations.md +919 -0
- package/bin/docs/engineering/02-product-and-requirements.md +186 -0
- package/bin/docs/engineering/03-user-experience-web-and-content.md +1352 -0
- package/bin/docs/engineering/04-architecture-and-design.md +387 -0
- package/bin/docs/engineering/05-code-quality-and-implementation.md +1103 -0
- package/bin/docs/engineering/06-application-services-and-apis.md +476 -0
- package/bin/docs/engineering/07-data-and-information-lifecycle.md +1009 -0
- package/bin/docs/engineering/08-security-and-cryptography.md +1215 -0
- package/bin/docs/engineering/09-privacy-and-data-protection.md +205 -0
- package/bin/docs/engineering/10-verification-and-testing.md +841 -0
- package/bin/docs/engineering/11-developer-experience-platform-and-delivery.md +1013 -0
- package/bin/docs/engineering/12-operations-sre-and-support.md +795 -0
- package/bin/docs/engineering/13-documentation-and-knowledge.md +349 -0
- package/bin/docs/engineering/14-trust-safety-and-ecosystems.md +330 -0
- package/bin/docs/engineering/15-ai-ml-and-ai-assisted-development.md +785 -0
- package/bin/docs/engineering/16-specialized-domains-and-release-assurance.md +775 -0
- package/bin/docs/engineering/source-manifest.md +479 -0
- package/bin/docs/guides/ai-assisted-review.md +61 -0
- package/bin/docs/guides/getting-started.md +78 -0
- package/bin/docs/index.md +66 -0
- package/bin/docs/prompts/evidence-challenge.md +26 -0
- package/bin/docs/prompts/full-readiness-review.md +34 -0
- package/bin/docs/prompts/release-diff-review.md +31 -0
- package/bin/docs/records/evidence-record.md +42 -0
- package/bin/docs/records/go-no-go-decision.md +63 -0
- package/bin/docs/records/release-assessment.md +124 -0
- package/bin/docs/records/risk-exception.md +64 -0
- package/bin/docs/references.md +52 -0
- package/bin/docs/scanner/ai-control-review.md +208 -0
- package/bin/docs/scanner/benchmarks.md +122 -0
- package/bin/docs/scanner/cli-contract.md +130 -0
- package/bin/docs/scanner/configuration.md +101 -0
- package/bin/docs/scanner/control-contracts.md +47 -0
- package/bin/docs/scanner/core-repository.md +62 -0
- package/bin/docs/scanner/diff-and-invalidation.md +79 -0
- package/bin/docs/scanner/doctor.md +71 -0
- package/bin/docs/scanner/getting-started.md +355 -0
- package/bin/docs/scanner/go-http-timeouts.md +96 -0
- package/bin/docs/scanner/infrastructure-policy.md +64 -0
- package/bin/docs/scanner/kubernetes-workloads.md +63 -0
- package/bin/docs/scanner/mcp-agent-integration.md +138 -0
- package/bin/docs/scanner/openapi-contracts.md +75 -0
- package/bin/docs/scanner/private-key-armor.md +44 -0
- package/bin/docs/scanner/releases.md +160 -0
- package/bin/docs/scanner/remediation.md +273 -0
- package/bin/docs/scanner/risk-exceptions.md +52 -0
- package/bin/docs/scanner/security-walkthrough.md +236 -0
- package/bin/docs/scanner/state-and-history.md +113 -0
- package/bin/docs/scanner/supply-chain.md +132 -0
- package/bin/docs/scanner/test-discovery.md +60 -0
- package/bin/docs/stylesheets/extra.css +183 -0
- package/bin/fixtures/benchmarks/core-native/suite-comprehensive.yaml +302 -0
- package/bin/fixtures/benchmarks/core-native/suite.yaml +59 -0
- package/bin/fixtures/benchmarks/core-native/targets/baseline/README.md +3 -0
- package/bin/fixtures/benchmarks/core-native/targets/baseline/app.go +1 -0
- package/bin/fixtures/benchmarks/core-native/targets/conflict-template/app.js +5 -0
- package/bin/fixtures/benchmarks/core-native/targets/container-risky-template/Dockerfile +2 -0
- package/bin/fixtures/benchmarks/core-native/targets/container-valid/Dockerfile +2 -0
- package/bin/fixtures/benchmarks/core-native/targets/dependency-lock-missing/package.json +5 -0
- package/bin/fixtures/benchmarks/core-native/targets/dependency-lock-present/package-lock.json +6 -0
- package/bin/fixtures/benchmarks/core-native/targets/dependency-lock-present/package.json +5 -0
- package/bin/fixtures/benchmarks/core-native/targets/empty-manifest-template/package.json +1 -0
- package/bin/fixtures/benchmarks/core-native/targets/final-newline-template/app.py +1 -0
- package/bin/fixtures/benchmarks/core-native/targets/foundation-present/.github/CODEOWNERS +1 -0
- package/bin/fixtures/benchmarks/core-native/targets/foundation-present/.github/dependabot.yml +6 -0
- package/bin/fixtures/benchmarks/core-native/targets/foundation-present/.github/workflows/validate.yml +15 -0
- package/bin/fixtures/benchmarks/core-native/targets/foundation-present/CODE_OF_CONDUCT.md +3 -0
- package/bin/fixtures/benchmarks/core-native/targets/foundation-present/CONTRIBUTING.md +3 -0
- package/bin/fixtures/benchmarks/core-native/targets/foundation-present/LICENSE +1 -0
- package/bin/fixtures/benchmarks/core-native/targets/foundation-present/README.md +3 -0
- package/bin/fixtures/benchmarks/core-native/targets/foundation-present/SECURITY.md +3 -0
- package/bin/fixtures/benchmarks/core-native/targets/foundation-present/package-lock.json +6 -0
- package/bin/fixtures/benchmarks/core-native/targets/foundation-present/package.json +7 -0
- package/bin/fixtures/benchmarks/core-native/targets/foundation-present/tests/example.test.js +3 -0
- package/bin/fixtures/benchmarks/core-native/targets/go-http-server-timeout-risky-template/go.mod +3 -0
- package/bin/fixtures/benchmarks/core-native/targets/go-http-server-timeout-risky-template/server.go +18 -0
- package/bin/fixtures/benchmarks/core-native/targets/go-http-timeout-malformed-template/client.go +3 -0
- package/bin/fixtures/benchmarks/core-native/targets/go-http-timeout-malformed-template/go.mod +3 -0
- package/bin/fixtures/benchmarks/core-native/targets/go-http-timeout-risky-template/client.go +7 -0
- package/bin/fixtures/benchmarks/core-native/targets/go-http-timeout-risky-template/go.mod +3 -0
- package/bin/fixtures/benchmarks/core-native/targets/go-http-timeout-safe/client.go +22 -0
- package/bin/fixtures/benchmarks/core-native/targets/go-http-timeout-safe/go.mod +3 -0
- package/bin/fixtures/benchmarks/core-native/targets/go-http-timeout-safe/hazards_test.go +8 -0
- package/bin/fixtures/benchmarks/core-native/targets/kubernetes-risky-template/deployment.yaml +27 -0
- package/bin/fixtures/benchmarks/core-native/targets/kubernetes-valid/deployment.yaml +26 -0
- package/bin/fixtures/benchmarks/core-native/targets/openapi-operation-ids-risky-template/openapi.yaml +17 -0
- package/bin/fixtures/benchmarks/core-native/targets/openapi-operation-responses-risky-template/openapi.yaml +11 -0
- package/bin/fixtures/benchmarks/core-native/targets/openapi-root-malformed-template/openapi.yaml +5 -0
- package/bin/fixtures/benchmarks/core-native/targets/openapi-root-risky-template/openapi.yaml +5 -0
- package/bin/fixtures/benchmarks/core-native/targets/openapi-root-valid/openapi.yaml +17 -0
- package/bin/fixtures/benchmarks/core-native/targets/package-test-command/app.js +3 -0
- package/bin/fixtures/benchmarks/core-native/targets/package-test-command/package.json +7 -0
- package/bin/fixtures/benchmarks/core-native/targets/package-test-placeholder/app.js +3 -0
- package/bin/fixtures/benchmarks/core-native/targets/package-test-placeholder/package.json +7 -0
- package/bin/fixtures/benchmarks/core-native/targets/private-key-template/deploy.pem +3 -0
- package/bin/fixtures/benchmarks/core-native/targets/readme-missing/fixture.txt +1 -0
- package/bin/fixtures/benchmarks/core-native/targets/runtime-missing/package-lock.json +6 -0
- package/bin/fixtures/benchmarks/core-native/targets/runtime-missing/package.json +4 -0
- package/bin/fixtures/benchmarks/core-native/targets/terraform-locked/.terraform.lock.hcl +3 -0
- package/bin/fixtures/benchmarks/core-native/targets/terraform-locked/main.tf +7 -0
- package/bin/fixtures/benchmarks/core-native/targets/terraform-unlocked-template/.terraform.lock.hcl +3 -0
- package/bin/fixtures/benchmarks/core-native/targets/terraform-unlocked-template/main.tf +7 -0
- package/bin/fixtures/benchmarks/core-native/targets/test-declaration-valid/app.py +2 -0
- package/bin/fixtures/benchmarks/core-native/targets/test-declaration-valid/tests/test_app.py +5 -0
- package/bin/fixtures/benchmarks/core-native/targets/test-path-without-declaration/app.py +2 -0
- package/bin/fixtures/benchmarks/core-native/targets/test-path-without-declaration/tests/test_app.py +1 -0
- package/bin/fixtures/benchmarks/core-native/targets/workflow-malformed/.github/workflows/validate.yml +1 -0
- package/bin/fixtures/benchmarks/core-native/targets/workflow-no-jobs/.github/workflows/empty.yml +9 -0
- package/bin/fixtures/benchmarks/core-native/targets/workflow-risky/.github/workflows/risky.yml +10 -0
- package/bin/fixtures/benchmarks/core-native/targets/workflow-valid/.github/workflows/validate.yml +14 -0
- package/bin/packs/core-foundation.yaml +25 -0
- package/bin/packs/core-native.yaml +59 -0
- package/bin/prc +0 -0
- package/bin/schemas/adapter-execution-v0.1.schema.json +101 -0
- package/bin/schemas/adapter-execution-v0.2.schema.json +128 -0
- package/bin/schemas/adapter-execution.schema.json +145 -0
- package/bin/schemas/adapter-fixture-report.schema.json +59 -0
- package/bin/schemas/adapter-fixture-suite.schema.json +104 -0
- package/bin/schemas/adapter-manifest-v0.1.schema.json +55 -0
- package/bin/schemas/adapter-manifest-v0.2.schema.json +122 -0
- package/bin/schemas/adapter-manifest-v0.3.schema.json +172 -0
- package/bin/schemas/adapter-manifest.schema.json +299 -0
- package/bin/schemas/adapter-message.schema.json +136 -0
- package/bin/schemas/adapter-registry-report.schema.json +13 -0
- package/bin/schemas/adapter-registry.schema.json +47 -0
- package/bin/schemas/agent-execution-v0.1.schema.json +26 -0
- package/bin/schemas/agent-execution.schema.json +26 -0
- package/bin/schemas/agent-failure-v0.1.schema.json +102 -0
- package/bin/schemas/agent-failure.schema.json +102 -0
- package/bin/schemas/agent-output-v0.1.schema.json +36 -0
- package/bin/schemas/agent-output.schema.json +36 -0
- package/bin/schemas/agent-task-v0.1.schema.json +44 -0
- package/bin/schemas/agent-task.schema.json +46 -0
- package/bin/schemas/assertion-catalog.schema.json +69 -0
- package/bin/schemas/benchmark-report.schema.json +94 -0
- package/bin/schemas/benchmark-suite.schema.json +116 -0
- package/bin/schemas/catalog-bundle.schema.json +27 -0
- package/bin/schemas/catalog-manifest.schema.json +23 -0
- package/bin/schemas/checkov-iac-policy-report.schema.json +82 -0
- package/bin/schemas/control-contracts.schema.json +44 -0
- package/bin/schemas/control-review-output.schema.json +51 -0
- package/bin/schemas/doctor.schema.json +53 -0
- package/bin/schemas/evidence-v0.1.schema.json +21 -0
- package/bin/schemas/evidence.schema.json +21 -0
- package/bin/schemas/finding-v0.1.schema.json +70 -0
- package/bin/schemas/finding.schema.json +70 -0
- package/bin/schemas/fix-contract-v0.1.schema.json +35 -0
- package/bin/schemas/fix-contract-v0.2.schema.json +46 -0
- package/bin/schemas/fix-contract-v0.3.schema.json +49 -0
- package/bin/schemas/fix-contract.schema.json +49 -0
- package/bin/schemas/grype-vulnerability-report.schema.json +88 -0
- package/bin/schemas/history.schema.json +37 -0
- package/bin/schemas/invalidation.schema.json +86 -0
- package/bin/schemas/inventory-v0.1.schema.json +42 -0
- package/bin/schemas/inventory-v0.2.schema.json +95 -0
- package/bin/schemas/inventory-v0.3.schema.json +139 -0
- package/bin/schemas/inventory.schema.json +139 -0
- package/bin/schemas/objective-catalog.schema.json +62 -0
- package/bin/schemas/pack-report.schema.json +16 -0
- package/bin/schemas/pack.schema.json +53 -0
- package/bin/schemas/plan-v0.1.schema.json +31 -0
- package/bin/schemas/plan-v0.2.schema.json +32 -0
- package/bin/schemas/plan-v0.3.schema.json +44 -0
- package/bin/schemas/plan-v0.4.schema.json +48 -0
- package/bin/schemas/plan-v0.5.schema.json +49 -0
- package/bin/schemas/plan-v0.6.schema.json +137 -0
- package/bin/schemas/plan.schema.json +137 -0
- package/bin/schemas/profile.schema.json +42 -0
- package/bin/schemas/project-config.schema.json +128 -0
- package/bin/schemas/release-manifest-v0.1.schema.json +86 -0
- package/bin/schemas/release-manifest-v0.2.schema.json +146 -0
- package/bin/schemas/release-manifest-v0.3.schema.json +146 -0
- package/bin/schemas/release-manifest.schema.json +6 -0
- package/bin/schemas/remediation-candidate-v0.1.schema.json +51 -0
- package/bin/schemas/remediation-candidate-v0.2.schema.json +51 -0
- package/bin/schemas/remediation-candidate-v0.3.schema.json +51 -0
- package/bin/schemas/remediation-candidate-v0.4.schema.json +69 -0
- package/bin/schemas/remediation-candidate.schema.json +69 -0
- package/bin/schemas/remediation-run-v0.1.schema.json +69 -0
- package/bin/schemas/remediation-run-v0.2.schema.json +78 -0
- package/bin/schemas/remediation-run-v0.3.schema.json +86 -0
- package/bin/schemas/remediation-run-v0.4.schema.json +86 -0
- package/bin/schemas/remediation-run-v0.5.schema.json +131 -0
- package/bin/schemas/remediation-run-v0.6.schema.json +143 -0
- package/bin/schemas/remediation-run-v0.7.schema.json +160 -0
- package/bin/schemas/remediation-run-v0.8.schema.json +161 -0
- package/bin/schemas/remediation-run.schema.json +161 -0
- package/bin/schemas/risk-exception-verification.schema.json +17 -0
- package/bin/schemas/risk-exception.schema.json +137 -0
- package/bin/schemas/run-result-v0.1.schema.json +54 -0
- package/bin/schemas/run-result-v0.10.schema.json +64 -0
- package/bin/schemas/run-result-v0.11.schema.json +146 -0
- package/bin/schemas/run-result-v0.2.schema.json +60 -0
- package/bin/schemas/run-result-v0.3.schema.json +52 -0
- package/bin/schemas/run-result-v0.4.schema.json +52 -0
- package/bin/schemas/run-result-v0.5.schema.json +60 -0
- package/bin/schemas/run-result-v0.6.schema.json +61 -0
- package/bin/schemas/run-result-v0.7.schema.json +61 -0
- package/bin/schemas/run-result-v0.8.schema.json +61 -0
- package/bin/schemas/run-result-v0.9.schema.json +77 -0
- package/bin/schemas/run-result.schema.json +165 -0
- package/bin/schemas/signature-verification.schema.json +22 -0
- package/bin/schemas/signature.schema.json +18 -0
- package/bin/schemas/state-check-v0.1.schema.json +27 -0
- package/bin/schemas/state-check.schema.json +28 -0
- package/bin/schemas/trust-store.schema.json +50 -0
- package/bin/schemas/verification-execution-v0.1.schema.json +105 -0
- package/bin/schemas/verification-execution.schema.json +105 -0
- package/bin/schemas/version-v0.1.schema.json +27 -0
- package/bin/schemas/version.schema.json +27 -0
- package/manifest.json +9 -0
- package/package.json +28 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Infrastructure policy profile
|
|
2
|
+
|
|
3
|
+
`prc/iac@0.1` combines bounded native checks with a reviewed Checkov 3.3.8
|
|
4
|
+
analysis of inventoried Terraform, Kubernetes, and container definitions. It is
|
|
5
|
+
applicable only when the inventory contains at least one of those inputs.
|
|
6
|
+
|
|
7
|
+
## Run it
|
|
8
|
+
|
|
9
|
+
Review `adapters/checkov-v3.3.8.yaml` in the release or repository root, then
|
|
10
|
+
pre-pull the exact reviewed image:
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
docker pull docker.io/bridgecrew/checkov@sha256:c64ffb6d6fc8087c896341a2c697770a04a1cf558db04fa7b8129d8ca6bce336
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Run the profile with an explicit local-verification capability grant:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
./prc scan /path/to/project \
|
|
20
|
+
--profile prc/iac \
|
|
21
|
+
--mode verify-local \
|
|
22
|
+
--adapter-manifest adapters/checkov-v3.3.8.yaml
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
The ordinary `prc scan` command does not launch Checkov or any other external
|
|
26
|
+
analyzer. The `verify-local` mode and exact manifest are both required.
|
|
27
|
+
|
|
28
|
+
## What is evaluated
|
|
29
|
+
|
|
30
|
+
The profile includes native checks for immutable container base identities,
|
|
31
|
+
non-root container users, Terraform dependency locks, Kubernetes non-root
|
|
32
|
+
workloads, privilege restrictions, Linux capabilities, seccomp, and container
|
|
33
|
+
resource requests and limits. `PRC-A-IAC-001` additionally consumes only the
|
|
34
|
+
`iac-policy` observations from the exact manifest digest bound into the catalog.
|
|
35
|
+
|
|
36
|
+
Checkov receives a scanner-owned list containing exactly the inventoried
|
|
37
|
+
Terraform, Kubernetes, and Dockerfile paths. A passing adapter result means that
|
|
38
|
+
the checks embedded in this pinned image reported no violation for supported
|
|
39
|
+
inputs. It does not prove deployed-state correctness, runtime behavior, cost,
|
|
40
|
+
drift, accessibility of external modules, or coverage by future policies.
|
|
41
|
+
|
|
42
|
+
## Isolation and failure behavior
|
|
43
|
+
|
|
44
|
+
The adapter:
|
|
45
|
+
|
|
46
|
+
- mounts a content-verified snapshot read-only and rechecks its digest before
|
|
47
|
+
and after execution;
|
|
48
|
+
- runs as the invoking non-root identity with no network, dropped capabilities,
|
|
49
|
+
a read-only container filesystem, bounded resources, and scanner-owned
|
|
50
|
+
scratch;
|
|
51
|
+
- disables policy downloads, result upload, external modules, variable
|
|
52
|
+
evaluation, and external checks;
|
|
53
|
+
- runs outside the target working directory so `.checkov.yml` cannot change the
|
|
54
|
+
scanner-owned policy or hide passed results;
|
|
55
|
+
- rejects inline suppressions, parsing errors, output drift, unexpected online
|
|
56
|
+
metadata, code disclosure, unbound paths, and unbounded records; and
|
|
57
|
+
- accepts bounded graph entity objects only long enough to validate the native
|
|
58
|
+
report, then discards them so raw target configuration is not persisted in
|
|
59
|
+
normalized artifacts.
|
|
60
|
+
|
|
61
|
+
A verified policy violation becomes a canonical finding in the detailed HTML
|
|
62
|
+
report. Unsupported files, ambiguous outcomes, parser failures, and safety
|
|
63
|
+
violations never become a pass. `prc scan` still does not modify Terraform,
|
|
64
|
+
Kubernetes, Dockerfiles, cloud resources, clusters, or any other target.
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Kubernetes workload analysis
|
|
2
|
+
|
|
3
|
+
The focused `prc/kubernetes@0.1` profile performs bounded, no-execution
|
|
4
|
+
repository analysis of detected Kubernetes workload manifests. Its six
|
|
5
|
+
assertions cover non-root execution, resource requests and limits, privileged
|
|
6
|
+
host access, privilege escalation, Linux capabilities, and seccomp profiles.
|
|
7
|
+
The same assertions are included in `prc/core-repository@1.0`.
|
|
8
|
+
|
|
9
|
+
Run only the Kubernetes assertions with:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
prc scan \
|
|
13
|
+
--target PATH \
|
|
14
|
+
--catalog-root PATH_TO_RELEASE \
|
|
15
|
+
--profile prc/kubernetes
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Security properties
|
|
19
|
+
|
|
20
|
+
The native checks inspect `Pod`, `Deployment`, `StatefulSet`, `DaemonSet`,
|
|
21
|
+
`ReplicaSet`, `Job`, and `CronJob` pod specifications. For ordinary, init, and
|
|
22
|
+
ephemeral containers where the field is defined by Kubernetes, they verify:
|
|
23
|
+
|
|
24
|
+
- `runAsNonRoot` is affirmed at pod or container scope and `runAsUser: 0` is
|
|
25
|
+
absent;
|
|
26
|
+
- host networking, PID, and IPC namespaces remain unset or false, Windows
|
|
27
|
+
HostProcess remains unset or false, `hostPath` volumes are absent, and
|
|
28
|
+
containers are not privileged;
|
|
29
|
+
- Linux containers explicitly set `allowPrivilegeEscalation: false`;
|
|
30
|
+
- Linux containers drop `ALL` capabilities and add back at most
|
|
31
|
+
`NET_BIND_SERVICE`;
|
|
32
|
+
- Linux containers inherit or select a `RuntimeDefault` or `Localhost` seccomp
|
|
33
|
+
profile; and
|
|
34
|
+
- ordinary and init containers declare nonempty resource requests and limits.
|
|
35
|
+
|
|
36
|
+
The security behavior follows the relevant Baseline and Restricted fields in
|
|
37
|
+
the authoritative
|
|
38
|
+
[Kubernetes Pod Security Standards](https://kubernetes.io/docs/concepts/security/pod-security-standards/).
|
|
39
|
+
The Linux-only privilege-escalation, capability, and seccomp requirements are
|
|
40
|
+
not applied when `spec.os.name` is explicitly `windows`, matching the standard's
|
|
41
|
+
operating-system distinction. The
|
|
42
|
+
[Kubernetes security-context documentation](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/)
|
|
43
|
+
explains how those fields affect container isolation.
|
|
44
|
+
|
|
45
|
+
## Evidence and failure behavior
|
|
46
|
+
|
|
47
|
+
Each result binds content-addressed evidence to the inventoried manifest. A
|
|
48
|
+
failure reports bounded file, line, and column locations without executing
|
|
49
|
+
`kubectl`, Helm, Kustomize, manifest hooks, or target code. A file over the
|
|
50
|
+
native parser limit, malformed YAML, a duplicate mapping key, an alias, a
|
|
51
|
+
mutation after inventory, or another unprovable parse condition returns an
|
|
52
|
+
execution error and `unknown`, never a pass.
|
|
53
|
+
|
|
54
|
+
## Deliberate limitations
|
|
55
|
+
|
|
56
|
+
This profile is not a complete Pod Security Admission implementation. It does
|
|
57
|
+
not render templates or overlays, inspect custom workload resources, resolve
|
|
58
|
+
external values, validate every Kubernetes API field, prove that admission
|
|
59
|
+
policy is enabled, inspect an image, contact a cluster, or prove what is
|
|
60
|
+
deployed. It also does not infer a risk exception for workloads that
|
|
61
|
+
intentionally need host or elevated access. Those cases require explicit,
|
|
62
|
+
separately authorized evidence or a signed time-bounded exception; the native
|
|
63
|
+
repository result remains a failure.
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# Read-only MCP agent integration
|
|
2
|
+
|
|
3
|
+
The scanner can expose its deterministic inspect surface to Codex, Claude Code,
|
|
4
|
+
or another local Model Context Protocol client. The MCP process is a read-only
|
|
5
|
+
observer for one target selected by the operator at startup. It does not give a
|
|
6
|
+
model a new write path, execute project commands, launch adapters or providers,
|
|
7
|
+
store state, apply remediation, accept risk, or make a release decision.
|
|
8
|
+
|
|
9
|
+
This separation is intentional: the agent may edit a workspace through its own
|
|
10
|
+
reviewed tools, while the scanner independently rebuilds evidence and decides
|
|
11
|
+
whether the exact target now satisfies the selected profile.
|
|
12
|
+
|
|
13
|
+
## Start a path-locked server
|
|
14
|
+
|
|
15
|
+
Build the scanner, then give the server absolute paths for both the trusted
|
|
16
|
+
catalog and the repository being assessed:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
go build -trimpath -o /absolute/path/prc ./cmd/prc
|
|
20
|
+
|
|
21
|
+
/absolute/path/prc mcp serve \
|
|
22
|
+
--catalog-root /absolute/path/production-readiness-checklist \
|
|
23
|
+
--target /absolute/path/project \
|
|
24
|
+
--profile prc/core-repository
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
An optional validated configuration can be locked into the assessment:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
/absolute/path/prc mcp serve \
|
|
31
|
+
--catalog-root /absolute/path/production-readiness-checklist \
|
|
32
|
+
--target /absolute/path/project \
|
|
33
|
+
--config /absolute/path/project/production-readiness.yaml
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
The server resolves catalog, target, and configuration symlinks once. The
|
|
37
|
+
catalog is validated and loaded once, and the selected profile cannot change
|
|
38
|
+
during that process. The target and configuration contents are read again for
|
|
39
|
+
every plan or scan so edits made outside the server invalidate their prior
|
|
40
|
+
content identities.
|
|
41
|
+
|
|
42
|
+
The stdio process writes only newline-delimited JSON-RPC messages to stdout.
|
|
43
|
+
Diagnostics use stderr. It supports the MCP `2025-11-25` and `2025-06-18`
|
|
44
|
+
handshake revisions, advertises a fixed tool list, and emits both structured
|
|
45
|
+
content and the same serialized JSON as text for older clients. See the official
|
|
46
|
+
[MCP lifecycle](https://modelcontextprotocol.io/specification/2025-11-25/basic/lifecycle),
|
|
47
|
+
[stdio transport](https://modelcontextprotocol.io/specification/2025-11-25/basic/transports),
|
|
48
|
+
and [tool result](https://modelcontextprotocol.io/specification/2025-11-25/server/tools)
|
|
49
|
+
contracts.
|
|
50
|
+
|
|
51
|
+
## Available tools
|
|
52
|
+
|
|
53
|
+
| Tool | Input | Result | Capability boundary |
|
|
54
|
+
| --- | --- | --- | --- |
|
|
55
|
+
| `prc_plan` | Empty object | Versioned inspect plan and execution DAG | Reads inventory; runs nothing |
|
|
56
|
+
| `prc_scan` | Empty object | Versioned run identity, gate, bounded inventory summary, assertion results, evidence, and findings | Native inspect implementations only |
|
|
57
|
+
| `prc_explain` | One `assertion_id` | Exact catalog assertion and sorted linked objectives | Catalog read only |
|
|
58
|
+
|
|
59
|
+
All three definitions set MCP `readOnlyHint: true`, `destructiveHint: false`,
|
|
60
|
+
and `openWorldHint: false`. Those annotations help a client present the tools,
|
|
61
|
+
but the implementation also enforces the boundary: tool arguments cannot supply
|
|
62
|
+
a target, catalog, configuration, command, adapter, provider, network host,
|
|
63
|
+
secret, output path, or remediation mode.
|
|
64
|
+
|
|
65
|
+
`prc_scan` omits the complete file inventory from the agent-facing payload to
|
|
66
|
+
bound context size. It retains the inventory digest, plan digest, canonical run
|
|
67
|
+
ID, evidence-linked result set, and canonical findings. Scanner errors are
|
|
68
|
+
returned as visible MCP tool errors; they are never rewritten as passing results.
|
|
69
|
+
|
|
70
|
+
## Connect Codex
|
|
71
|
+
|
|
72
|
+
Codex local clients support command-launched stdio MCP servers. Register the
|
|
73
|
+
scanner with the same absolute, operator-reviewed arguments:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
codex mcp add production-readiness -- \
|
|
77
|
+
/absolute/path/prc mcp serve \
|
|
78
|
+
--catalog-root /absolute/path/production-readiness-checklist \
|
|
79
|
+
--target /absolute/path/project \
|
|
80
|
+
--profile prc/core-repository
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Codex stores server configuration in user or trusted-project configuration;
|
|
84
|
+
review that scope before enabling it. See the official
|
|
85
|
+
[Codex MCP documentation](https://developers.openai.com/codex/mcp/).
|
|
86
|
+
|
|
87
|
+
## Connect Claude Code
|
|
88
|
+
|
|
89
|
+
Use a local scope unless the exact command should deliberately be shared with a
|
|
90
|
+
team:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
claude mcp add --transport stdio --scope local production-readiness -- \
|
|
94
|
+
/absolute/path/prc mcp serve \
|
|
95
|
+
--catalog-root /absolute/path/production-readiness-checklist \
|
|
96
|
+
--target /absolute/path/project \
|
|
97
|
+
--profile prc/core-repository
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Confirm the connection with `claude mcp get production-readiness` or `/mcp`.
|
|
101
|
+
Claude Code documents local stdio commands and the security implications of MCP
|
|
102
|
+
configuration in its official
|
|
103
|
+
[MCP guide](https://code.claude.com/docs/en/mcp).
|
|
104
|
+
|
|
105
|
+
## Evidence-driven agent loop
|
|
106
|
+
|
|
107
|
+
An agent using this server should follow one narrow loop:
|
|
108
|
+
|
|
109
|
+
1. Call `prc_plan` and preserve every blocked or undetermined node.
|
|
110
|
+
2. Call `prc_scan` and use its `run_id`, `plan_digest`, finding IDs, and evidence
|
|
111
|
+
as the baseline.
|
|
112
|
+
3. Use `prc_explain` before changing code for an unfamiliar assertion.
|
|
113
|
+
4. Propose or make one bounded change through the agent host's normal reviewed
|
|
114
|
+
filesystem tools, not through this MCP server.
|
|
115
|
+
5. Call `prc_scan` again. A changed workspace must produce a new inventory,
|
|
116
|
+
plan, and run identity.
|
|
117
|
+
6. Continue only while changes remain within the user's authority and the
|
|
118
|
+
scanner reports independently verifiable findings. Stop on unknown, manual,
|
|
119
|
+
policy, production-only, or organizational evidence that code cannot prove.
|
|
120
|
+
|
|
121
|
+
The current `prc/core-repository@1.0` profile contains 40 repository assertions.
|
|
122
|
+
A satisfied profile means only that this versioned profile passed for that exact
|
|
123
|
+
inventory and evidence set. It does not mean that all 10,042 checklist controls,
|
|
124
|
+
runtime behavior, production infrastructure, organizational processes, or
|
|
125
|
+
unknown defects were autonomously verified.
|
|
126
|
+
|
|
127
|
+
## Fail-closed limits
|
|
128
|
+
|
|
129
|
+
The server rejects duplicate JSON keys, unknown request and tool fields,
|
|
130
|
+
non-integer numeric request IDs, path-like tool arguments, messages larger than
|
|
131
|
+
1 MiB, and successful tool payloads larger than 8 MiB. Calls are accepted only
|
|
132
|
+
after the MCP initialization lifecycle completes. A clean stdin close ends the
|
|
133
|
+
process normally; startup configuration failures use CLI exit `3`, and a broken
|
|
134
|
+
stdio transport uses exit `4`.
|
|
135
|
+
|
|
136
|
+
There is intentionally no MCP remediation tool. Use the scanner's
|
|
137
|
+
[bounded isolated remediation](remediation.md) commands separately when their
|
|
138
|
+
explicit candidate and policy controls fit the task.
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# OpenAPI contract analysis
|
|
2
|
+
|
|
3
|
+
`PRC-A-API-001` through `PRC-A-API-003` are language-neutral, no-execution
|
|
4
|
+
checks for the bounded root and directly declared operation structure of
|
|
5
|
+
detected OpenAPI YAML and JSON documents. They are available as the focused
|
|
6
|
+
`prc/api@0.1` profile and as part of `prc/core-repository@1.0`. Inventory recognizes the
|
|
7
|
+
conventional `openapi.yaml`, `openapi.yml`, and `openapi.json` names, plus
|
|
8
|
+
bounded YAML files with a top-level OpenAPI 3.x marker. Each detection is
|
|
9
|
+
recorded as an `api-description` component and a sourced fact with an explicit
|
|
10
|
+
limitation: a description does not prove that its API is implemented, reachable,
|
|
11
|
+
or deployed.
|
|
12
|
+
|
|
13
|
+
Run only these contract checks with:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
prc scan --target PATH --catalog-root PATH_TO_RELEASE --profile prc/api
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## What the rule proves
|
|
20
|
+
|
|
21
|
+
For published OpenAPI 3.0, 3.1, and 3.2 feature versions, the native checks
|
|
22
|
+
verifies that:
|
|
23
|
+
|
|
24
|
+
- the file contains exactly one parseable YAML or JSON document with an object
|
|
25
|
+
root;
|
|
26
|
+
- `openapi` is a nonempty supported semantic version string;
|
|
27
|
+
- `info` is an object with nonempty string `title` and `version` fields;
|
|
28
|
+
- OpenAPI 3.0 has a `paths` object; and
|
|
29
|
+
- OpenAPI 3.1 and 3.2 have at least one object-valued `paths`, `components`, or
|
|
30
|
+
`webhooks` field;
|
|
31
|
+
- every directly declared operation under `paths` or `webhooks` has a nonempty
|
|
32
|
+
Responses Object containing at least one valid response code or `default`;
|
|
33
|
+
- every inline Response Object has its required nonempty `description`, while a
|
|
34
|
+
structurally valid `$ref` remains a reference rather than an invented pass for
|
|
35
|
+
its remote target; and
|
|
36
|
+
- every declared `operationId` is a nonempty string and is unique within that
|
|
37
|
+
OpenAPI document. Because `operationId` is optional, the check does not require
|
|
38
|
+
one where the specification does not.
|
|
39
|
+
|
|
40
|
+
These are requirements from the authoritative
|
|
41
|
+
[OpenAPI 3.0.4 specification](https://spec.openapis.org/oas/v3.0.4.html),
|
|
42
|
+
[OpenAPI 3.1.2 specification](https://spec.openapis.org/oas/v3.1.2.html), and
|
|
43
|
+
[OpenAPI 3.2.0 specification](https://spec.openapis.org/oas/v3.2.0.html).
|
|
44
|
+
OpenAPI 3.1 and 3.2 descriptions may legitimately describe only reusable
|
|
45
|
+
components or webhooks, while 3.0 requires `paths`; an empty Paths Object is
|
|
46
|
+
allowed by the specifications.
|
|
47
|
+
|
|
48
|
+
Duplicate mapping keys, non-string mapping keys, missing required
|
|
49
|
+
metadata, and incorrect root-field types produce a finding with bounded source
|
|
50
|
+
locations. Invalid syntax produces Error/Unknown. A syntactically valid but
|
|
51
|
+
unsupported feature version, such as a future 3.3 document, also produces
|
|
52
|
+
Error/Unknown instead of a false Pass or Fail; a new benchmarked implementation
|
|
53
|
+
version is required before the scanner claims support.
|
|
54
|
+
|
|
55
|
+
## Bounds and evidence
|
|
56
|
+
|
|
57
|
+
The implementation inspects at most 256 detected documents and 64 MiB in total.
|
|
58
|
+
The shared native reader caps each parsed file at 4 MiB and verifies its bytes
|
|
59
|
+
against the content-addressed inventory before parsing. YAML shape inspection is
|
|
60
|
+
bounded to 100,000 nodes and 128 levels. The scanner records file-hash evidence,
|
|
61
|
+
never document content, and reports at most 100 structural problems.
|
|
62
|
+
|
|
63
|
+
## Deliberate limitations
|
|
64
|
+
|
|
65
|
+
This is not a complete OpenAPI conformance validator. Operation checks cover
|
|
66
|
+
operations declared directly under `paths` and `webhooks`, including the
|
|
67
|
+
OpenAPI 3.2 `query` and `additionalOperations` fields. They do not resolve Path
|
|
68
|
+
Item references, callbacks, multi-document descriptions, response references,
|
|
69
|
+
or remote documents. A reference is therefore not proof that its target is
|
|
70
|
+
valid. The checks also do not validate every nested object, compare the
|
|
71
|
+
description with application routes or deployed behavior, lint API design, test
|
|
72
|
+
requests, infer exposure, or decide compatibility. Full conformance, contract
|
|
73
|
+
testing, reference resolution, and runtime drift require separately versioned
|
|
74
|
+
adapters with explicit filesystem, process, network, authentication, target,
|
|
75
|
+
and destructive-request policies.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Bounded private-key armor inspection
|
|
2
|
+
|
|
3
|
+
`PRC-A-CORE-031` is a deterministic, no-network guard against committing
|
|
4
|
+
recognized armored private-key blocks. It inspects content-addressed files from
|
|
5
|
+
the current inventory and never copies a matched marker or following key bytes
|
|
6
|
+
into evidence, findings, logs, or reports. A failure identifies only the file
|
|
7
|
+
path, inventory and content digests, and a redacted summary.
|
|
8
|
+
|
|
9
|
+
The native rules cover private and encrypted private-key labels standardized by
|
|
10
|
+
[RFC 7468](https://www.rfc-editor.org/info/rfc7468/), legacy RSA, EC, and DSA
|
|
11
|
+
private-key labels, the
|
|
12
|
+
[OpenSSH private-key format](https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.key),
|
|
13
|
+
and armored PGP private-key blocks. Public-key and certificate armor is not a
|
|
14
|
+
failure.
|
|
15
|
+
|
|
16
|
+
## Fail-closed bounds
|
|
17
|
+
|
|
18
|
+
The check scans recognized source, configuration, documentation,
|
|
19
|
+
infrastructure, environment, and key-file paths. Repository dotfiles are also
|
|
20
|
+
included, except platform metadata that is already excluded by inventory. It
|
|
21
|
+
stops as Blocked/Unknown instead of returning Pass when any of these bounds
|
|
22
|
+
would prevent complete inspection:
|
|
23
|
+
|
|
24
|
+
- 10,000 candidate files;
|
|
25
|
+
- 8 MiB per candidate file; or
|
|
26
|
+
- 256 MiB across all candidate files.
|
|
27
|
+
|
|
28
|
+
Every file is reopened without following a symlink and checked against its
|
|
29
|
+
inventoried size, mode, and SHA-256 before its bytes are inspected. A target
|
|
30
|
+
mutation is an execution error, never a passing result. Reports include at most
|
|
31
|
+
100 violating locations while retaining the exact total count.
|
|
32
|
+
|
|
33
|
+
## Deliberate limitations
|
|
34
|
+
|
|
35
|
+
This check does not inspect Git history, ignored dependency/cache directories,
|
|
36
|
+
binary or unrecognized file types, remote artifacts, container layers, secret
|
|
37
|
+
stores, deployed environments, or arbitrary vendor API-token formats. It does
|
|
38
|
+
not prove that a recognized key is live, but a detected private-key block is
|
|
39
|
+
still a critical no-go because verification must not expose or exercise it.
|
|
40
|
+
|
|
41
|
+
Broader secret detection belongs to a maintained, digest-pinned analysis
|
|
42
|
+
adapter with a tool-specific benchmark corpus. Until such an adapter is
|
|
43
|
+
published and authorized, `PRC-A-CORE-013` remains independently Blocked; this
|
|
44
|
+
narrow native check must not be presented as complete secret-scanning coverage.
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# Scanner releases and verification
|
|
2
|
+
|
|
3
|
+
Scanner binaries use `scanner-vX.Y.Z` tags so their experimental product version
|
|
4
|
+
does not collide with versions of the checklist corpus. A release is built only
|
|
5
|
+
from the exact tagged commit. The workflow reruns the source, catalog, schema,
|
|
6
|
+
security, benchmark, and pack gates before publishing anything.
|
|
7
|
+
|
|
8
|
+
## Release contents
|
|
9
|
+
|
|
10
|
+
Each scanner release contains:
|
|
11
|
+
|
|
12
|
+
- Linux, macOS, and Windows archives for AMD64 and ARM64;
|
|
13
|
+
- one dependency-free `@marinjursic/prc` npm launcher tarball and six exact
|
|
14
|
+
native npm platform tarballs for the same systems;
|
|
15
|
+
- a binary with the scanner version, source revision, source timestamp, and Go
|
|
16
|
+
toolchain embedded in `prc version --format json`;
|
|
17
|
+
- the exact compatible `catalog/`, `packs/`, and `schemas/` trees in every
|
|
18
|
+
archive, together with the catalog's human-readable objective sources and the
|
|
19
|
+
packs' benchmark fixtures;
|
|
20
|
+
- a versioned release manifest binding artifact digests to the catalog and pack
|
|
21
|
+
validation digests;
|
|
22
|
+
- a timestamp-free [CycloneDX 1.6](https://cyclonedx.org/specification/overview/)
|
|
23
|
+
module SBOM;
|
|
24
|
+
- a canonical self-scan of the exact tagged source, executed by the packaged
|
|
25
|
+
binary against its bundled catalog without hiding blocked or manual results;
|
|
26
|
+
- `SHA256SUMS`; and
|
|
27
|
+
- GitHub-hosted Sigstore attestations for SLSA build provenance and the
|
|
28
|
+
CycloneDX SBOM predicate.
|
|
29
|
+
|
|
30
|
+
The SBOM describes the scanner's Go module and resolved Go dependencies. It does
|
|
31
|
+
not claim that the bundled catalog data, schemas, host operating system, or
|
|
32
|
+
future adapter images are Go components; those files are integrity-bound by the
|
|
33
|
+
archive checksum and release manifest instead. GitHub documents what its
|
|
34
|
+
[artifact attestations](https://docs.github.com/en/actions/how-tos/secure-your-work/use-artifact-attestations/use-artifact-attestations)
|
|
35
|
+
prove and how consumers should verify them.
|
|
36
|
+
|
|
37
|
+
The builder fixes archive order, ownership, modes, paths, timestamps, binary
|
|
38
|
+
metadata, and source identity. CI builds the complete release twice and requires
|
|
39
|
+
a byte-for-byte directory comparison. This is a reproducibility check under the
|
|
40
|
+
same declared CI toolchain; it is not a claim that provenance or reproducibility
|
|
41
|
+
proves the artifact is secure.
|
|
42
|
+
|
|
43
|
+
## Verify before running
|
|
44
|
+
|
|
45
|
+
Download the archive, `SHA256SUMS`, release manifest, and SBOM from the same
|
|
46
|
+
GitHub release. Verify the checksum from the directory containing those files:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
sha256sum --check SHA256SUMS
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
On macOS, verify one downloaded archive against the matching line instead:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
shasum -a 256 prc_0.1.0_darwin_arm64.tar.gz
|
|
56
|
+
grep 'prc_0.1.0_darwin_arm64.tar.gz' SHA256SUMS
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Then verify that GitHub's signed provenance binds the archive to this repository
|
|
60
|
+
and release workflow:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
gh attestation verify prc_0.1.0_linux_amd64.tar.gz \
|
|
64
|
+
--repo MarinJursic/production-readiness-checklist
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Verify the separate CycloneDX SBOM attestation using its recognized predicate:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
gh attestation verify prc_0.1.0_linux_amd64.tar.gz \
|
|
71
|
+
--repo MarinJursic/production-readiness-checklist \
|
|
72
|
+
--predicate-type https://cyclonedx.org/bom
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Finally, inspect `prc_X.Y.Z_release-manifest.json` and compare its
|
|
76
|
+
`source_commit`, catalog digest, pack digests, and artifact digest with the
|
|
77
|
+
assessment scope you intend to use. Inspect `prc_X.Y.Z_self-scan.json` as a
|
|
78
|
+
normal `prc.run/v0.12` report: a valid signed self-assessment may still be
|
|
79
|
+
`environment_blocked` because organizational, production, or adapter evidence
|
|
80
|
+
is deliberately unavailable in the release job. After extraction:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
./prc_X.Y.Z_linux_amd64/prc version --format json
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
The release manifest also binds every npm tarball. Before the packages are
|
|
87
|
+
published to npm, they can be tested directly from one release directory. On
|
|
88
|
+
Linux x64, for example:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
mkdir npm-smoke && cd npm-smoke
|
|
92
|
+
npm install --ignore-scripts --offline --no-audit --no-fund --package-lock=false \
|
|
93
|
+
../marinjursic-prc-linux-x64-X.Y.Z.tgz \
|
|
94
|
+
../marinjursic-prc-X.Y.Z.tgz
|
|
95
|
+
./node_modules/.bin/prc version --format json
|
|
96
|
+
./node_modules/.bin/prc scan /path/to/project
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
The platform package contains the native binary and its exact catalog. The
|
|
100
|
+
launcher checks the platform manifest and binary SHA-256 and never downloads a
|
|
101
|
+
fallback or starts a binary found on `PATH`. Public npm publishing uses npm
|
|
102
|
+
trusted publishing from the pinned release workflow, so the workflow refuses
|
|
103
|
+
`NPM_TOKEN` and `NODE_AUTH_TOKEN`. It verifies all seven tarballs against the
|
|
104
|
+
release manifest, publishes the six native packages before the launcher,
|
|
105
|
+
verifies the registry SHA-512 for every package, and safely skips only an
|
|
106
|
+
already-published version with exactly matching bytes. Because npm versions are
|
|
107
|
+
immutable, any byte mismatch stops the release. The publisher also runs npm in
|
|
108
|
+
a new empty working directory with user, global, and environment npm
|
|
109
|
+
configuration removed, so a saved `.npmrc` token cannot silently replace OIDC.
|
|
110
|
+
|
|
111
|
+
The release job builds once, uploads those exact bytes, then runs the matching
|
|
112
|
+
native archive and npm launcher on Linux x64, Linux ARM64, macOS x64, macOS
|
|
113
|
+
ARM64, Windows x64, and Windows ARM64. Publication starts only after every host
|
|
114
|
+
has completed a real 10,042-control smoke scan.
|
|
115
|
+
|
|
116
|
+
### One-time npm owner setup
|
|
117
|
+
|
|
118
|
+
npm requires a package to exist before a trusted publisher can be configured.
|
|
119
|
+
The owner must therefore bootstrap each of the seven package names once from
|
|
120
|
+
the exact verified release tarballs, with npm's required human authentication.
|
|
121
|
+
Then configure the same trusted-publisher identity on every package:
|
|
122
|
+
|
|
123
|
+
- repository owner: `MarinJursic`;
|
|
124
|
+
- repository: `production-readiness-checklist`;
|
|
125
|
+
- workflow filename: `release-scanner.yml`; and
|
|
126
|
+
- no GitHub environment unless the workflow is later changed to use one.
|
|
127
|
+
|
|
128
|
+
After that one-time setup, `scanner-vX.Y.Z` tags use OIDC and no long-lived npm
|
|
129
|
+
publishing secret. The release workflow requires Node.js 22.14 or newer and npm
|
|
130
|
+
11.5.1 or newer for trusted publishing. npm provenance links a package to its
|
|
131
|
+
build source; it does not prove the package has no unsafe code.
|
|
132
|
+
|
|
133
|
+
Do not substitute a successful signature check for vulnerability review or a
|
|
134
|
+
production-readiness decision. An attestation proves the signed claim's origin
|
|
135
|
+
and integrity, not the absence of defects.
|
|
136
|
+
|
|
137
|
+
## Release failure and revocation
|
|
138
|
+
|
|
139
|
+
Publishing is fail closed: an invalid tag, test failure, benchmark regression,
|
|
140
|
+
schema failure, vulnerability finding, non-reproducible output, checksum error,
|
|
141
|
+
or attestation failure prevents release publication. A failed workflow is not a
|
|
142
|
+
release and its temporary artifacts are not supported.
|
|
143
|
+
|
|
144
|
+
If a signing identity, workflow dependency, tool, release asset, catalog, pack,
|
|
145
|
+
or scanner version is compromised or materially incorrect, maintainers will:
|
|
146
|
+
|
|
147
|
+
1. publish a private-to-public security advisory as coordination permits;
|
|
148
|
+
2. mark the affected release and version as revoked, with the exact artifact
|
|
149
|
+
digests and reason;
|
|
150
|
+
3. remove or revoke affected attestations where the platform supports it;
|
|
151
|
+
4. never reuse the affected version or tag and never replace an asset under the
|
|
152
|
+
same name;
|
|
153
|
+
5. publish a new patched version from a reviewed commit with new checksums,
|
|
154
|
+
SBOM, provenance, and compatibility manifest; and
|
|
155
|
+
6. update bundled trust stores or registry revocations when a pack, adapter, or
|
|
156
|
+
publisher identity is affected.
|
|
157
|
+
|
|
158
|
+
Consumers should stop using a revoked artifact even if its historical signature
|
|
159
|
+
still verifies: verification establishes who produced it, not whether it remains
|
|
160
|
+
approved.
|