@marinjursic/prc-linux-arm64 0.1.0 → 0.2.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/DISCLOSURE +21 -0
- package/README.md +5 -1
- package/bin/catalog/assertions/core-repository.yaml +28 -28
- package/bin/catalog/control-check-bindings.json.gz +0 -0
- package/bin/catalog/control-check-programs.json.gz +0 -0
- package/bin/catalog/control-contracts.json.gz +0 -0
- package/bin/catalog/control-id-registry.json.gz +0 -0
- package/bin/fixtures/benchmarks/core-native/suite-comprehensive.yaml +10 -1
- package/bin/fixtures/benchmarks/core-native/suite.yaml +13 -2
- package/bin/packs/core-foundation.yaml +4 -4
- package/bin/packs/core-native.yaml +10 -10
- package/bin/prc +0 -0
- package/bin/schemas/adapter-execution-v0.3.schema.json +145 -0
- package/bin/schemas/authoritative-evidence-bundle.schema.json +38 -0
- package/bin/schemas/authoritative-evidence-set.schema.json +38 -0
- package/bin/schemas/authoritative-evidence-verification.schema.json +54 -0
- package/bin/schemas/automatic-coverage.schema.json +49 -0
- package/bin/schemas/control-check-bindings.schema.json +119 -0
- package/bin/schemas/control-check-evidence-v0.1.schema.json +244 -0
- package/bin/schemas/control-check-evidence.schema.json +244 -0
- package/bin/schemas/control-check-program-catalog.schema.json +160 -0
- package/bin/schemas/control-check-program-definitions.schema.json +139 -0
- package/bin/schemas/control-check-program.schema.json +298 -0
- package/bin/schemas/control-classification-final.schema.json +64 -0
- package/bin/schemas/control-classification-review.schema.json +161 -0
- package/bin/schemas/control-classification-skeptic-review.schema.json +96 -0
- package/bin/schemas/control-classification-strength-review.schema.json +90 -0
- package/bin/schemas/control-contracts.schema.json +101 -12
- package/bin/schemas/control-review-output-v0.2.schema.json +66 -0
- package/bin/schemas/control-review-output.schema.json +22 -3
- package/bin/schemas/evidence-requirements.schema.json +144 -0
- package/bin/schemas/evidence-set-verification.schema.json +65 -0
- package/bin/schemas/provider-capabilities.schema.json +26 -0
- package/bin/schemas/run-result-v0.10.schema.json +5 -5
- package/bin/schemas/run-result-v0.11.schema.json +5 -5
- package/bin/schemas/run-result-v0.12.schema.json +270 -0
- package/bin/schemas/run-result.schema.json +166 -16
- package/bin/schemas/signature-verification.schema.json +8 -1
- package/bin/schemas/signature.schema.json +8 -1
- package/bin/schemas/trust-store.schema.json +8 -1
- package/manifest.json +1144 -5
- package/package.json +8 -3
- package/bin/LICENSE +0 -21
- package/bin/README.md +0 -335
- package/bin/catalog/control-contracts.json +0 -1
- package/bin/catalog/control-id-registry.json +0 -110470
- package/bin/docs/architecture/adapters.md +0 -380
- package/bin/docs/architecture/agent-providers.md +0 -188
- package/bin/docs/architecture/applicability.md +0 -80
- package/bin/docs/architecture/catalog-integrity.md +0 -85
- package/bin/docs/architecture/evidence-and-results.md +0 -154
- package/bin/docs/architecture/execution-plans.md +0 -61
- package/bin/docs/architecture/product-contract.md +0 -76
- package/bin/docs/architecture/publisher-trust.md +0 -68
- package/bin/docs/architecture/remediation-contract.md +0 -113
- package/bin/docs/architecture/trust-model.md +0 -95
- package/bin/docs/assets/hero.svg +0 -37
- package/bin/docs/assets/logo.svg +0 -13
- 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 +0 -40
- package/bin/docs/engineering/source-manifest.md +0 -479
- package/bin/docs/guides/ai-assisted-review.md +0 -61
- package/bin/docs/guides/getting-started.md +0 -78
- package/bin/docs/index.md +0 -66
- package/bin/docs/prompts/evidence-challenge.md +0 -26
- package/bin/docs/prompts/full-readiness-review.md +0 -34
- package/bin/docs/prompts/release-diff-review.md +0 -31
- package/bin/docs/records/evidence-record.md +0 -42
- package/bin/docs/records/go-no-go-decision.md +0 -63
- package/bin/docs/records/release-assessment.md +0 -124
- package/bin/docs/records/risk-exception.md +0 -64
- package/bin/docs/references.md +0 -52
- package/bin/docs/scanner/ai-control-review.md +0 -208
- package/bin/docs/scanner/benchmarks.md +0 -122
- package/bin/docs/scanner/cli-contract.md +0 -130
- package/bin/docs/scanner/configuration.md +0 -101
- package/bin/docs/scanner/control-contracts.md +0 -47
- package/bin/docs/scanner/core-repository.md +0 -62
- package/bin/docs/scanner/diff-and-invalidation.md +0 -79
- package/bin/docs/scanner/doctor.md +0 -71
- package/bin/docs/scanner/getting-started.md +0 -355
- package/bin/docs/scanner/go-http-timeouts.md +0 -96
- package/bin/docs/scanner/infrastructure-policy.md +0 -64
- package/bin/docs/scanner/kubernetes-workloads.md +0 -63
- package/bin/docs/scanner/mcp-agent-integration.md +0 -138
- package/bin/docs/scanner/openapi-contracts.md +0 -75
- package/bin/docs/scanner/private-key-armor.md +0 -44
- package/bin/docs/scanner/releases.md +0 -160
- package/bin/docs/scanner/remediation.md +0 -273
- package/bin/docs/scanner/risk-exceptions.md +0 -52
- package/bin/docs/scanner/security-walkthrough.md +0 -236
- package/bin/docs/scanner/state-and-history.md +0 -113
- package/bin/docs/scanner/supply-chain.md +0 -132
- package/bin/docs/scanner/test-discovery.md +0 -60
- package/bin/docs/stylesheets/extra.css +0 -183
package/DISCLOSURE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
Production Readiness Checklist is a defensive, read-only assessment tool for
|
|
2
|
+
software projects that the user owns or is authorized to inspect.
|
|
3
|
+
|
|
4
|
+
The scanner includes security-related capabilities that can resemble dual-use
|
|
5
|
+
security tooling. It can identify exposed-secret patterns with bundled,
|
|
6
|
+
version-pinned Gitleaks rules. With an explicit verify-local capability grant,
|
|
7
|
+
it can invoke pinned Gitleaks, Syft, Grype, or Checkov container images against
|
|
8
|
+
local project files. It can also prepare bounded project context for an
|
|
9
|
+
explicitly selected Codex or Claude review. These features are intended to help
|
|
10
|
+
maintainers find production-readiness gaps in their own software.
|
|
11
|
+
|
|
12
|
+
The default scan does not change project files, install project dependencies,
|
|
13
|
+
run project lifecycle scripts, exploit a target, upload project contents, or
|
|
14
|
+
contact external analyzers. External adapters are opt-in, use exact manifests
|
|
15
|
+
and pinned inputs, and are designed to run without network access. AI review is
|
|
16
|
+
opt-in and advisory; it cannot create a verified pass.
|
|
17
|
+
|
|
18
|
+
The package contains no exploit payloads and is not intended for unauthorized
|
|
19
|
+
access, credential collection, persistence, evasion, or harm. Users are
|
|
20
|
+
responsible for scanning only projects and systems they are authorized to
|
|
21
|
+
assess.
|
package/README.md
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
# Production Readiness Checklist native package
|
|
2
2
|
|
|
3
|
-
This
|
|
3
|
+
This is one operating-system and CPU build of the native `prc` scanner. It is an internal package installed automatically by `@marinjursic/prc`; install and invoke the launcher instead of depending on this package directly.
|
|
4
|
+
|
|
5
|
+
The package has no npm dependencies and no install, update, or lifecycle scripts. It does not download a binary after installation. The launcher selects the exact package for the current machine, verifies the release-bound manifest, checks the SHA-256 and size of the native executable and every runtime support file, and fails closed if anything is missing or changed.
|
|
6
|
+
|
|
7
|
+
A normal scan reads a user-selected project and writes a private report outside that project. It does not fix project files, install project dependencies, or run project scripts. Security analyzers and Codex or Claude review require explicit opt-in. See the launcher package and project documentation for installation, supported commands, the dual-use disclosure, checksums, SBOM, and provenance information.
|
|
@@ -2,16 +2,16 @@ schema_version: prc.assertions/v0.1
|
|
|
2
2
|
catalog_version: 1.0.0
|
|
3
3
|
assertions:
|
|
4
4
|
- id: PRC-A-CORE-001
|
|
5
|
-
revision:
|
|
5
|
+
revision: 3
|
|
6
6
|
control_ids: [USEQ-FDCA6C71]
|
|
7
7
|
title: README is present
|
|
8
|
-
statement: A
|
|
8
|
+
statement: A README file containing non-whitespace UTF-8 text exists at the repository root.
|
|
9
9
|
applicability: "true"
|
|
10
10
|
evidence_required:
|
|
11
11
|
- kind: repository-file
|
|
12
12
|
minimum_authority: repository
|
|
13
|
-
description: A
|
|
14
|
-
implementation_id: prc.native.file-present@0.
|
|
13
|
+
description: A root README containing non-whitespace UTF-8 text from the scanned commit.
|
|
14
|
+
implementation_id: prc.native.file-present@0.2
|
|
15
15
|
parameters:
|
|
16
16
|
paths: [README.md, README.rst, README.txt]
|
|
17
17
|
minimum_bytes: 1
|
|
@@ -19,16 +19,16 @@ assertions:
|
|
|
19
19
|
gate: required
|
|
20
20
|
remediation_class: R2
|
|
21
21
|
- id: PRC-A-CORE-002
|
|
22
|
-
revision:
|
|
22
|
+
revision: 2
|
|
23
23
|
control_ids: [USEQ-6497B434]
|
|
24
24
|
title: License is present
|
|
25
|
-
statement: A
|
|
25
|
+
statement: A license file containing non-whitespace UTF-8 text exists at the repository root.
|
|
26
26
|
applicability: "true"
|
|
27
27
|
evidence_required:
|
|
28
28
|
- kind: repository-file
|
|
29
29
|
minimum_authority: repository
|
|
30
|
-
description: A
|
|
31
|
-
implementation_id: prc.native.file-present@0.
|
|
30
|
+
description: A root license file containing non-whitespace UTF-8 text from the scanned commit.
|
|
31
|
+
implementation_id: prc.native.file-present@0.2
|
|
32
32
|
parameters:
|
|
33
33
|
paths: [LICENSE, LICENSE.md, LICENSE.txt, COPYING]
|
|
34
34
|
minimum_bytes: 1
|
|
@@ -36,16 +36,16 @@ assertions:
|
|
|
36
36
|
gate: required
|
|
37
37
|
remediation_class: R0
|
|
38
38
|
- id: PRC-A-CORE-003
|
|
39
|
-
revision:
|
|
39
|
+
revision: 2
|
|
40
40
|
control_ids: [USEQ-89F5E97A]
|
|
41
41
|
title: Contribution guidance is present
|
|
42
|
-
statement: A
|
|
42
|
+
statement: A contribution guide containing non-whitespace UTF-8 text exists at the repository root.
|
|
43
43
|
applicability: "true"
|
|
44
44
|
evidence_required:
|
|
45
45
|
- kind: repository-file
|
|
46
46
|
minimum_authority: repository
|
|
47
|
-
description: A
|
|
48
|
-
implementation_id: prc.native.file-present@0.
|
|
47
|
+
description: A root contribution guide containing non-whitespace UTF-8 text from the scanned commit.
|
|
48
|
+
implementation_id: prc.native.file-present@0.2
|
|
49
49
|
parameters:
|
|
50
50
|
paths: [CONTRIBUTING.md, CONTRIBUTING.rst]
|
|
51
51
|
minimum_bytes: 1
|
|
@@ -53,16 +53,16 @@ assertions:
|
|
|
53
53
|
gate: advisory
|
|
54
54
|
remediation_class: R0
|
|
55
55
|
- id: PRC-A-CORE-004
|
|
56
|
-
revision:
|
|
56
|
+
revision: 2
|
|
57
57
|
control_ids: [USEQ-AC6AC548]
|
|
58
58
|
title: Security policy is present
|
|
59
|
-
statement: A
|
|
59
|
+
statement: A security policy containing non-whitespace UTF-8 text exists at the repository root.
|
|
60
60
|
applicability: "true"
|
|
61
61
|
evidence_required:
|
|
62
62
|
- kind: repository-file
|
|
63
63
|
minimum_authority: repository
|
|
64
|
-
description: A
|
|
65
|
-
implementation_id: prc.native.file-present@0.
|
|
64
|
+
description: A root security policy containing non-whitespace UTF-8 text from the scanned commit.
|
|
65
|
+
implementation_id: prc.native.file-present@0.2
|
|
66
66
|
parameters:
|
|
67
67
|
paths: [SECURITY.md, docs/SECURITY.md]
|
|
68
68
|
minimum_bytes: 1
|
|
@@ -70,16 +70,16 @@ assertions:
|
|
|
70
70
|
gate: required
|
|
71
71
|
remediation_class: R0
|
|
72
72
|
- id: PRC-A-CORE-005
|
|
73
|
-
revision:
|
|
73
|
+
revision: 2
|
|
74
74
|
control_ids: [USEQ-D73106BF]
|
|
75
75
|
title: Code of conduct is present
|
|
76
|
-
statement: A
|
|
76
|
+
statement: A code-of-conduct document containing non-whitespace UTF-8 text exists at the repository root.
|
|
77
77
|
applicability: "true"
|
|
78
78
|
evidence_required:
|
|
79
79
|
- kind: repository-file
|
|
80
80
|
minimum_authority: repository
|
|
81
|
-
description: A
|
|
82
|
-
implementation_id: prc.native.file-present@0.
|
|
81
|
+
description: A root code-of-conduct document containing non-whitespace UTF-8 text from the scanned commit.
|
|
82
|
+
implementation_id: prc.native.file-present@0.2
|
|
83
83
|
parameters:
|
|
84
84
|
paths: [CODE_OF_CONDUCT.md, CODE_OF_CONDUCT.rst]
|
|
85
85
|
minimum_bytes: 1
|
|
@@ -87,16 +87,16 @@ assertions:
|
|
|
87
87
|
gate: advisory
|
|
88
88
|
remediation_class: R0
|
|
89
89
|
- id: PRC-A-CORE-006
|
|
90
|
-
revision:
|
|
90
|
+
revision: 2
|
|
91
91
|
control_ids: [USEQ-CA602113]
|
|
92
92
|
title: Code ownership is declared
|
|
93
|
-
statement: A
|
|
93
|
+
statement: A CODEOWNERS file containing non-whitespace UTF-8 text exists in a supported repository location.
|
|
94
94
|
applicability: "true"
|
|
95
95
|
evidence_required:
|
|
96
96
|
- kind: repository-file
|
|
97
97
|
minimum_authority: repository
|
|
98
|
-
description: A
|
|
99
|
-
implementation_id: prc.native.file-present@0.
|
|
98
|
+
description: A CODEOWNERS file containing non-whitespace UTF-8 text from the scanned commit.
|
|
99
|
+
implementation_id: prc.native.file-present@0.2
|
|
100
100
|
parameters:
|
|
101
101
|
paths: [.github/CODEOWNERS, CODEOWNERS, docs/CODEOWNERS]
|
|
102
102
|
minimum_bytes: 1
|
|
@@ -244,16 +244,16 @@ assertions:
|
|
|
244
244
|
gate: required
|
|
245
245
|
remediation_class: R0
|
|
246
246
|
- id: PRC-A-CORE-016
|
|
247
|
-
revision:
|
|
247
|
+
revision: 2
|
|
248
248
|
control_ids: [PRC-36-011]
|
|
249
249
|
title: Dependency updates are configured
|
|
250
|
-
statement: A supported dependency-update automation configuration is present.
|
|
250
|
+
statement: A supported dependency-update automation configuration containing non-whitespace UTF-8 text is present.
|
|
251
251
|
applicability: inventory.package_ecosystems.size() > 0
|
|
252
252
|
evidence_required:
|
|
253
253
|
- kind: repository-file
|
|
254
254
|
minimum_authority: repository
|
|
255
|
-
description: A
|
|
256
|
-
implementation_id: prc.native.file-present@0.
|
|
255
|
+
description: A supported dependency-update configuration containing non-whitespace UTF-8 text.
|
|
256
|
+
implementation_id: prc.native.file-present@0.2
|
|
257
257
|
parameters:
|
|
258
258
|
paths: [.github/dependabot.yml, .github/dependabot.yaml, renovate.json, renovate.json5, .renovaterc, .renovaterc.json]
|
|
259
259
|
minimum_bytes: 1
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
schema_version: prc.benchmark-suite/v0.2
|
|
2
|
-
id: prc.benchmark.core-native@1.
|
|
2
|
+
id: prc.benchmark.core-native@1.1
|
|
3
3
|
title: Comprehensive core native assertion benchmark
|
|
4
4
|
profile_id: prc/core-repository
|
|
5
5
|
cases:
|
|
@@ -78,6 +78,15 @@ cases:
|
|
|
78
78
|
target: targets/readme-missing
|
|
79
79
|
expectations:
|
|
80
80
|
- {assertion_id: PRC-A-CORE-001, assessment: fail, execution: completed}
|
|
81
|
+
- id: readme-whitespace
|
|
82
|
+
target: targets/baseline
|
|
83
|
+
setup:
|
|
84
|
+
- operation: replace_text
|
|
85
|
+
path: README.md
|
|
86
|
+
find: "# Benchmark baseline\n\nThis fixture exercises repository, inapplicable, manual, and blocked outcomes.\n"
|
|
87
|
+
replace: "\uFEFF\u00A0\u2003\n"
|
|
88
|
+
expectations:
|
|
89
|
+
- {assertion_id: PRC-A-CORE-001, assessment: fail, execution: completed}
|
|
81
90
|
- id: test-declaration-valid
|
|
82
91
|
target: targets/test-declaration-valid
|
|
83
92
|
expectations:
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
schema_version: prc.benchmark-suite/v0.
|
|
2
|
-
id: prc.benchmark.core-native@0.
|
|
1
|
+
schema_version: prc.benchmark-suite/v0.2
|
|
2
|
+
id: prc.benchmark.core-native@0.2
|
|
3
3
|
title: Core native assertion benchmark
|
|
4
4
|
profile_id: prc/core-repository
|
|
5
5
|
cases:
|
|
@@ -39,6 +39,17 @@ cases:
|
|
|
39
39
|
- assertion_id: PRC-A-CORE-001
|
|
40
40
|
assessment: fail
|
|
41
41
|
execution: completed
|
|
42
|
+
- id: readme-whitespace
|
|
43
|
+
target: targets/baseline
|
|
44
|
+
setup:
|
|
45
|
+
- operation: replace_text
|
|
46
|
+
path: README.md
|
|
47
|
+
find: "# Benchmark baseline\n\nThis fixture exercises repository, inapplicable, manual, and blocked outcomes.\n"
|
|
48
|
+
replace: "\uFEFF\u00A0\u2003\n"
|
|
49
|
+
expectations:
|
|
50
|
+
- assertion_id: PRC-A-CORE-001
|
|
51
|
+
assessment: fail
|
|
52
|
+
execution: completed
|
|
42
53
|
- id: workflow-malformed
|
|
43
54
|
target: targets/workflow-malformed
|
|
44
55
|
expectations:
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
schema_version: prc.pack/v0.1
|
|
2
|
-
id: prc.pack.core-foundation@0.
|
|
2
|
+
id: prc.pack.core-foundation@0.2
|
|
3
3
|
title: Core repository validated foundation
|
|
4
4
|
description: A small, measured foundation of deterministic repository checks.
|
|
5
5
|
publisher_id: prc-project
|
|
@@ -8,7 +8,7 @@ engine_apis: [prc.engine/v0.1]
|
|
|
8
8
|
profile_ids: [prc/core-repository]
|
|
9
9
|
assertions:
|
|
10
10
|
- assertion_id: PRC-A-CORE-001
|
|
11
|
-
implementation_id: prc.native.file-present@0.
|
|
11
|
+
implementation_id: prc.native.file-present@0.2
|
|
12
12
|
validated_outcomes: [pass, fail]
|
|
13
13
|
- assertion_id: PRC-A-CORE-007
|
|
14
14
|
implementation_id: prc.native.dependency-lock@0.1
|
|
@@ -17,9 +17,9 @@ assertions:
|
|
|
17
17
|
implementation_id: prc.native.github-workflow-valid@0.1
|
|
18
18
|
validated_outcomes: [pass, not_applicable, error]
|
|
19
19
|
benchmark:
|
|
20
|
-
suite_id: prc.benchmark.core-native@0.
|
|
20
|
+
suite_id: prc.benchmark.core-native@0.2
|
|
21
21
|
suite_path: fixtures/benchmarks/core-native/suite.yaml
|
|
22
|
-
suite_sha256:
|
|
22
|
+
suite_sha256: 06a20e9bf344e4a1684043f6a90a1aed714eca4efc59a015d84e890e5acd5395
|
|
23
23
|
limitations:
|
|
24
24
|
- The pack covers only three native assertions and is not the complete core profile.
|
|
25
25
|
- The initial fixtures do not establish cross-platform or large-repository performance.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
schema_version: prc.pack/v0.1
|
|
2
|
-
id: prc.pack.core-native@1.
|
|
2
|
+
id: prc.pack.core-native@1.1
|
|
3
3
|
title: Core native assertion pack
|
|
4
4
|
description: Catalog-wide deterministic checks measured against the comprehensive core fixture corpus.
|
|
5
5
|
publisher_id: prc-project
|
|
@@ -7,12 +7,12 @@ maintenance: active
|
|
|
7
7
|
engine_apis: [prc.engine/v0.1]
|
|
8
8
|
profile_ids: [prc/core-repository, prc/api, prc/kubernetes]
|
|
9
9
|
assertions:
|
|
10
|
-
- {assertion_id: PRC-A-CORE-001, implementation_id: prc.native.file-present@0.
|
|
11
|
-
- {assertion_id: PRC-A-CORE-002, implementation_id: prc.native.file-present@0.
|
|
12
|
-
- {assertion_id: PRC-A-CORE-003, implementation_id: prc.native.file-present@0.
|
|
13
|
-
- {assertion_id: PRC-A-CORE-004, implementation_id: prc.native.file-present@0.
|
|
14
|
-
- {assertion_id: PRC-A-CORE-005, implementation_id: prc.native.file-present@0.
|
|
15
|
-
- {assertion_id: PRC-A-CORE-006, implementation_id: prc.native.file-present@0.
|
|
10
|
+
- {assertion_id: PRC-A-CORE-001, implementation_id: prc.native.file-present@0.2, validated_outcomes: [pass, fail]}
|
|
11
|
+
- {assertion_id: PRC-A-CORE-002, implementation_id: prc.native.file-present@0.2, validated_outcomes: [pass, fail]}
|
|
12
|
+
- {assertion_id: PRC-A-CORE-003, implementation_id: prc.native.file-present@0.2, validated_outcomes: [pass, fail]}
|
|
13
|
+
- {assertion_id: PRC-A-CORE-004, implementation_id: prc.native.file-present@0.2, validated_outcomes: [pass, fail]}
|
|
14
|
+
- {assertion_id: PRC-A-CORE-005, implementation_id: prc.native.file-present@0.2, validated_outcomes: [pass, fail]}
|
|
15
|
+
- {assertion_id: PRC-A-CORE-006, implementation_id: prc.native.file-present@0.2, validated_outcomes: [pass, fail]}
|
|
16
16
|
- {assertion_id: PRC-A-CORE-007, implementation_id: prc.native.dependency-lock@0.1, validated_outcomes: [pass, fail, not_applicable]}
|
|
17
17
|
- {assertion_id: PRC-A-CORE-008, implementation_id: prc.native.github-action-pin@0.1, validated_outcomes: [pass, fail, not_applicable]}
|
|
18
18
|
- {assertion_id: PRC-A-CORE-009, implementation_id: prc.native.ci-present@0.1, validated_outcomes: [pass, fail]}
|
|
@@ -22,7 +22,7 @@ assertions:
|
|
|
22
22
|
- {assertion_id: PRC-A-CORE-013, implementation_id: prc.native.analysis-evidence@0.1, validated_outcomes: [blocked]}
|
|
23
23
|
- {assertion_id: PRC-A-CORE-014, implementation_id: prc.native.final-newline@0.1, validated_outcomes: [pass, fail]}
|
|
24
24
|
- {assertion_id: PRC-A-CORE-015, implementation_id: prc.native.git-revision@0.1, validated_outcomes: [pass, fail]}
|
|
25
|
-
- {assertion_id: PRC-A-CORE-016, implementation_id: prc.native.file-present@0.
|
|
25
|
+
- {assertion_id: PRC-A-CORE-016, implementation_id: prc.native.file-present@0.2, validated_outcomes: [pass, fail, not_applicable]}
|
|
26
26
|
- {assertion_id: PRC-A-CORE-017, implementation_id: prc.native.github-workflow-valid@0.1, validated_outcomes: [pass, not_applicable, error]}
|
|
27
27
|
- {assertion_id: PRC-A-CORE-018, implementation_id: prc.native.github-workflow-jobs@0.1, validated_outcomes: [pass, fail, not_applicable, error]}
|
|
28
28
|
- {assertion_id: PRC-A-CORE-019, implementation_id: prc.native.github-workflow-timeouts@0.1, validated_outcomes: [pass, fail, not_applicable, error]}
|
|
@@ -48,9 +48,9 @@ assertions:
|
|
|
48
48
|
- {assertion_id: PRC-A-K8S-003, implementation_id: prc.native.kubernetes-capabilities@0.1, validated_outcomes: [pass, fail, not_applicable]}
|
|
49
49
|
- {assertion_id: PRC-A-K8S-004, implementation_id: prc.native.kubernetes-seccomp@0.1, validated_outcomes: [pass, fail, not_applicable]}
|
|
50
50
|
benchmark:
|
|
51
|
-
suite_id: prc.benchmark.core-native@1.
|
|
51
|
+
suite_id: prc.benchmark.core-native@1.1
|
|
52
52
|
suite_path: fixtures/benchmarks/core-native/suite-comprehensive.yaml
|
|
53
|
-
suite_sha256:
|
|
53
|
+
suite_sha256: 532a5828a6e283d38ddcdbae71fdbbfd03159128067e5a8037dac3f6a36ac4b3
|
|
54
54
|
limitations:
|
|
55
55
|
- Manual-review and adapter-backed assertions are validated only in their fail-closed manual or blocked states.
|
|
56
56
|
- OpenAPI operation checks cover direct path and webhook operations; referenced Path Items, callbacks, multi-document descriptions, and referenced responses require a future bounded resolver or adapter.
|
package/bin/prc
CHANGED
|
Binary file
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://marinjursic.github.io/production-readiness-checklist/schemas/adapter-execution-v0.3.schema.json",
|
|
4
|
+
"title": "Bound Production Readiness Adapter Execution v0.3",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": ["schema_version", "execution_id", "adapter_run_id", "adapter_id", "manifest_sha256", "image", "resolution", "data_inputs", "subject", "started_at", "completed_at", "duration_ms", "diagnostics_sha256", "diagnostics_bytes", "transcript"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"schema_version": {"const": "prc.adapter-execution/v0.3"},
|
|
10
|
+
"execution_id": {"type": "string", "pattern": "^[0-9a-f]{64}$"},
|
|
11
|
+
"adapter_run_id": {"type": "string", "pattern": "^[0-9a-f]{64}$"},
|
|
12
|
+
"adapter_id": {"type": "string", "pattern": "^prc\\.adapter\\.[a-z0-9.-]+@[0-9]+\\.[0-9]+$"},
|
|
13
|
+
"manifest_sha256": {"type": "string", "pattern": "^[0-9a-f]{64}$"},
|
|
14
|
+
"image": {"type": "string", "pattern": "^.+@sha256:[0-9a-f]{64}$"},
|
|
15
|
+
"resolution": {"$ref": "#/$defs/resolution"},
|
|
16
|
+
"data_inputs": {
|
|
17
|
+
"type": "array",
|
|
18
|
+
"maxItems": 16,
|
|
19
|
+
"items": {"$ref": "#/$defs/data_input"}
|
|
20
|
+
},
|
|
21
|
+
"subject": {"$ref": "#/$defs/subject"},
|
|
22
|
+
"started_at": {"type": "string", "format": "date-time"},
|
|
23
|
+
"completed_at": {"type": "string", "format": "date-time"},
|
|
24
|
+
"duration_ms": {"type": "integer", "minimum": 0},
|
|
25
|
+
"diagnostics_sha256": {"type": "string", "pattern": "^[0-9a-f]{64}$"},
|
|
26
|
+
"diagnostics_bytes": {"type": "integer", "minimum": 0},
|
|
27
|
+
"transcript": {"$ref": "#/$defs/transcript"}
|
|
28
|
+
},
|
|
29
|
+
"$defs": {
|
|
30
|
+
"data_input": {
|
|
31
|
+
"type": "object",
|
|
32
|
+
"additionalProperties": false,
|
|
33
|
+
"required": ["name", "destination", "sha256", "files", "bytes"],
|
|
34
|
+
"properties": {
|
|
35
|
+
"name": {"type": "string", "pattern": "^[a-z0-9][a-z0-9.-]{0,127}$"},
|
|
36
|
+
"destination": {"type": "string", "pattern": "^/prc-inputs/[a-z0-9][a-z0-9.-]{0,127}$"},
|
|
37
|
+
"sha256": {"type": "string", "pattern": "^[0-9a-f]{64}$"},
|
|
38
|
+
"files": {"type": "integer", "minimum": 1},
|
|
39
|
+
"bytes": {"type": "integer", "minimum": 1}
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
"resolution": {
|
|
43
|
+
"type": "object",
|
|
44
|
+
"additionalProperties": false,
|
|
45
|
+
"required": ["source", "publisher_id", "trust"],
|
|
46
|
+
"properties": {
|
|
47
|
+
"source": {"enum": ["explicit-local", "registry"]},
|
|
48
|
+
"publisher_id": {"type": "string", "pattern": "^[a-z0-9][a-z0-9.-]{0,127}$"},
|
|
49
|
+
"trust": {"enum": ["local-explicit", "first-party-sandboxed", "verified-community", "unverified-community", "local"]},
|
|
50
|
+
"registry_id": {"type": "string", "pattern": "^prc\\.adapter-registry\\.[a-z0-9.-]+@[0-9]+\\.[0-9]+$"},
|
|
51
|
+
"registry_revision": {"type": "integer", "minimum": 1},
|
|
52
|
+
"registry_digest": {"type": "string", "pattern": "^[0-9a-f]{64}$"}
|
|
53
|
+
},
|
|
54
|
+
"allOf": [
|
|
55
|
+
{
|
|
56
|
+
"if": {"properties": {"source": {"const": "registry"}}},
|
|
57
|
+
"then": {
|
|
58
|
+
"required": ["registry_id", "registry_revision", "registry_digest"],
|
|
59
|
+
"properties": {"trust": {"enum": ["first-party-sandboxed", "verified-community", "unverified-community", "local"]}}
|
|
60
|
+
},
|
|
61
|
+
"else": {
|
|
62
|
+
"properties": {"trust": {"const": "local-explicit"}},
|
|
63
|
+
"not": {"anyOf": [{"required": ["registry_id"]}, {"required": ["registry_revision"]}, {"required": ["registry_digest"]}]}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
},
|
|
68
|
+
"subject": {
|
|
69
|
+
"type": "object",
|
|
70
|
+
"additionalProperties": false,
|
|
71
|
+
"required": ["target_name", "inventory_digest"],
|
|
72
|
+
"properties": {
|
|
73
|
+
"target_name": {"type": "string", "minLength": 1},
|
|
74
|
+
"target_commit": {"type": "string", "pattern": "^[0-9a-f]{40,64}$"},
|
|
75
|
+
"inventory_digest": {"type": "string", "pattern": "^[0-9a-f]{64}$"}
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
"location": {
|
|
79
|
+
"type": "object",
|
|
80
|
+
"additionalProperties": false,
|
|
81
|
+
"required": ["path"],
|
|
82
|
+
"properties": {
|
|
83
|
+
"path": {"type": "string", "minLength": 1},
|
|
84
|
+
"line": {"type": "integer", "minimum": 0},
|
|
85
|
+
"column": {"type": "integer", "minimum": 0}
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
"observation": {
|
|
89
|
+
"type": "object",
|
|
90
|
+
"additionalProperties": false,
|
|
91
|
+
"required": ["id", "kind", "outcome", "summary", "locations"],
|
|
92
|
+
"properties": {
|
|
93
|
+
"id": {"type": "string", "minLength": 1},
|
|
94
|
+
"kind": {"type": "string", "minLength": 1},
|
|
95
|
+
"outcome": {"enum": ["found", "not_found", "value", "unsupported"]},
|
|
96
|
+
"summary": {"type": "string", "minLength": 1},
|
|
97
|
+
"locations": {"type": "array", "items": {"$ref": "#/$defs/location"}},
|
|
98
|
+
"data": {"type": "object"}
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
"artifact": {
|
|
102
|
+
"type": "object",
|
|
103
|
+
"additionalProperties": false,
|
|
104
|
+
"required": ["id", "media_type", "digest", "size"],
|
|
105
|
+
"properties": {
|
|
106
|
+
"id": {"type": "string", "minLength": 1},
|
|
107
|
+
"media_type": {"type": "string", "minLength": 1},
|
|
108
|
+
"digest": {"type": "string", "pattern": "^sha256:[0-9a-f]{64}$"},
|
|
109
|
+
"size": {"type": "integer", "minimum": 0},
|
|
110
|
+
"path": {"type": "string", "minLength": 1}
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
"log": {
|
|
114
|
+
"type": "object",
|
|
115
|
+
"additionalProperties": false,
|
|
116
|
+
"required": ["level", "message"],
|
|
117
|
+
"properties": {
|
|
118
|
+
"level": {"enum": ["debug", "info", "warning", "error"]},
|
|
119
|
+
"message": {"type": "string", "minLength": 1}
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
"summary": {
|
|
123
|
+
"type": "object",
|
|
124
|
+
"additionalProperties": false,
|
|
125
|
+
"required": ["status", "counts"],
|
|
126
|
+
"properties": {
|
|
127
|
+
"status": {"enum": ["completed", "partial", "unsupported", "configuration_error", "execution_error", "timeout", "parse_error"]},
|
|
128
|
+
"counts": {"type": "object", "additionalProperties": {"type": "integer", "minimum": 0}},
|
|
129
|
+
"reason": {"type": "string", "minLength": 1}
|
|
130
|
+
},
|
|
131
|
+
"allOf": [{"if": {"properties": {"status": {"not": {"const": "completed"}}}}, "then": {"required": ["reason"]}}]
|
|
132
|
+
},
|
|
133
|
+
"transcript": {
|
|
134
|
+
"type": "object",
|
|
135
|
+
"additionalProperties": false,
|
|
136
|
+
"required": ["logs", "observations", "artifacts", "summary"],
|
|
137
|
+
"properties": {
|
|
138
|
+
"logs": {"type": "array", "items": {"$ref": "#/$defs/log"}},
|
|
139
|
+
"observations": {"type": "array", "items": {"$ref": "#/$defs/observation"}},
|
|
140
|
+
"artifacts": {"type": "array", "items": {"$ref": "#/$defs/artifact"}},
|
|
141
|
+
"summary": {"$ref": "#/$defs/summary"}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://marinjursic.github.io/production-readiness-checklist/schemas/authoritative-evidence-bundle.schema.json",
|
|
4
|
+
"title": "Production Readiness Authoritative Evidence Bundle v0.1",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": ["schema_version", "id", "catalog_sha256", "inventory_sha256", "authority", "entries"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"schema_version": {"const": "prc.authoritative-evidence-bundle/v0.1"},
|
|
10
|
+
"id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9./@_-]{0,255}$"},
|
|
11
|
+
"catalog_sha256": {"$ref": "#/$defs/digest"},
|
|
12
|
+
"inventory_sha256": {"$ref": "#/$defs/digest"},
|
|
13
|
+
"authority": {"$ref": "#/$defs/authority"},
|
|
14
|
+
"entries": {
|
|
15
|
+
"type": "array",
|
|
16
|
+
"minItems": 1,
|
|
17
|
+
"maxItems": 765,
|
|
18
|
+
"items": {"$ref": "#/$defs/entry"}
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"$defs": {
|
|
22
|
+
"digest": {"type": "string", "pattern": "^[0-9a-f]{64}$"},
|
|
23
|
+
"authority": {
|
|
24
|
+
"enum": ["repository", "artifact", "executed", "environment", "external_registry", "structured_record"]
|
|
25
|
+
},
|
|
26
|
+
"entry": {
|
|
27
|
+
"type": "object",
|
|
28
|
+
"additionalProperties": false,
|
|
29
|
+
"required": ["template_id", "provider_id", "program", "evidence"],
|
|
30
|
+
"properties": {
|
|
31
|
+
"template_id": {"$ref": "#/$defs/digest"},
|
|
32
|
+
"provider_id": {"type": "string", "pattern": "^[a-z0-9][a-z0-9._/@:-]{0,255}$"},
|
|
33
|
+
"program": {"$ref": "control-check-program.schema.json"},
|
|
34
|
+
"evidence": {"$ref": "control-check-evidence.schema.json"}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://marinjursic.github.io/production-readiness-checklist/schemas/authoritative-evidence-set.schema.json",
|
|
4
|
+
"title": "Production Readiness Authoritative Evidence Set v0.1",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": ["schema_version", "trust_store_file", "bundles"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"schema_version": {"const": "prc.authoritative-evidence-set/v0.1"},
|
|
10
|
+
"trust_store_file": {"$ref": "#/$defs/file_name"},
|
|
11
|
+
"bundles": {
|
|
12
|
+
"type": "array",
|
|
13
|
+
"minItems": 1,
|
|
14
|
+
"maxItems": 6,
|
|
15
|
+
"items": {"$ref": "#/$defs/bundle"}
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"$defs": {
|
|
19
|
+
"file_name": {
|
|
20
|
+
"type": "string",
|
|
21
|
+
"pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$"
|
|
22
|
+
},
|
|
23
|
+
"authority": {
|
|
24
|
+
"enum": ["artifact", "environment", "executed", "external_registry", "repository", "structured_record"]
|
|
25
|
+
},
|
|
26
|
+
"bundle": {
|
|
27
|
+
"type": "object",
|
|
28
|
+
"additionalProperties": false,
|
|
29
|
+
"required": ["authority", "bundle_file", "policy_signature_file", "evidence_signature_file"],
|
|
30
|
+
"properties": {
|
|
31
|
+
"authority": {"$ref": "#/$defs/authority"},
|
|
32
|
+
"bundle_file": {"$ref": "#/$defs/file_name"},
|
|
33
|
+
"policy_signature_file": {"$ref": "#/$defs/file_name"},
|
|
34
|
+
"evidence_signature_file": {"$ref": "#/$defs/file_name"}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://marinjursic.github.io/production-readiness-checklist/schemas/authoritative-evidence-verification.schema.json",
|
|
4
|
+
"title": "Production Readiness Authoritative Evidence Verification v0.1",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": [
|
|
8
|
+
"schema_version", "bundle_id", "bundle_sha256", "policy_sha256", "catalog_sha256", "inventory_sha256",
|
|
9
|
+
"authority", "entry_count", "entries", "policy_signature", "evidence_signature"
|
|
10
|
+
],
|
|
11
|
+
"properties": {
|
|
12
|
+
"schema_version": {"const": "prc.authoritative-evidence-verification/v0.1"},
|
|
13
|
+
"bundle_id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9./@_-]{0,255}$"},
|
|
14
|
+
"bundle_sha256": {"$ref": "#/$defs/digest"},
|
|
15
|
+
"policy_sha256": {"$ref": "#/$defs/digest"},
|
|
16
|
+
"catalog_sha256": {"$ref": "#/$defs/digest"},
|
|
17
|
+
"inventory_sha256": {"$ref": "#/$defs/digest"},
|
|
18
|
+
"authority": {
|
|
19
|
+
"enum": ["repository", "artifact", "executed", "environment", "external_registry", "structured_record"]
|
|
20
|
+
},
|
|
21
|
+
"entry_count": {"type": "integer", "minimum": 1, "maximum": 765},
|
|
22
|
+
"entries": {
|
|
23
|
+
"type": "array",
|
|
24
|
+
"minItems": 1,
|
|
25
|
+
"maxItems": 765,
|
|
26
|
+
"items": {"$ref": "#/$defs/entry"}
|
|
27
|
+
},
|
|
28
|
+
"policy_signature": {"$ref": "signature-verification.schema.json"},
|
|
29
|
+
"evidence_signature": {"$ref": "signature-verification.schema.json"}
|
|
30
|
+
},
|
|
31
|
+
"$defs": {
|
|
32
|
+
"digest": {"type": "string", "pattern": "^[0-9a-f]{64}$"},
|
|
33
|
+
"entry": {
|
|
34
|
+
"type": "object",
|
|
35
|
+
"additionalProperties": false,
|
|
36
|
+
"required": ["template_id", "provider_id", "program", "evidence_sha256", "outcome", "reason_code"],
|
|
37
|
+
"properties": {
|
|
38
|
+
"template_id": {"$ref": "#/$defs/digest"},
|
|
39
|
+
"provider_id": {"type": "string", "pattern": "^[a-z0-9][a-z0-9._/@:-]{0,255}$"},
|
|
40
|
+
"program": {"$ref": "control-check-program.schema.json"},
|
|
41
|
+
"evidence_sha256": {"$ref": "#/$defs/digest"},
|
|
42
|
+
"outcome": {"enum": ["pass", "fail", "blocked", "not_applicable"]},
|
|
43
|
+
"reason_code": {
|
|
44
|
+
"enum": [
|
|
45
|
+
"passed", "predicate_false", "not_applicable", "invalid_program", "invalid_evidence",
|
|
46
|
+
"evidence_binding_mismatch", "wrong_authority", "evidence_stale", "evidence_from_future",
|
|
47
|
+
"evidence_incomplete", "evidence_conflicting", "applicability_unknown",
|
|
48
|
+
"not_applicable_disallowed", "applicability_proof_missing", "fact_missing", "fact_type_mismatch"
|
|
49
|
+
]
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://marinjursic.github.io/production-readiness-checklist/schemas/automatic-coverage.schema.json",
|
|
4
|
+
"title": "Production Readiness Automatic Coverage v0.1",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": [
|
|
8
|
+
"schema_version", "control_count", "reviewed_routing_control_count",
|
|
9
|
+
"deterministic_control_count", "nondeterministic_control_count", "advisory_ai_review_control_count", "exact_clause_count",
|
|
10
|
+
"exact_predicate_clause_count", "built_in_collector_clause_count",
|
|
11
|
+
"signed_import_supported_clause_count", "authorities"
|
|
12
|
+
],
|
|
13
|
+
"properties": {
|
|
14
|
+
"schema_version": {"const": "prc.automatic-coverage/v0.1"},
|
|
15
|
+
"control_count": {"type": "integer", "minimum": 1},
|
|
16
|
+
"reviewed_routing_control_count": {"type": "integer", "minimum": 0},
|
|
17
|
+
"deterministic_control_count": {"type": "integer", "minimum": 0},
|
|
18
|
+
"nondeterministic_control_count": {"type": "integer", "minimum": 0},
|
|
19
|
+
"advisory_ai_review_control_count": {"type": "integer", "minimum": 0},
|
|
20
|
+
"exact_clause_count": {"type": "integer", "minimum": 0},
|
|
21
|
+
"exact_predicate_clause_count": {"type": "integer", "minimum": 0},
|
|
22
|
+
"built_in_collector_clause_count": {"type": "integer", "minimum": 0},
|
|
23
|
+
"signed_import_supported_clause_count": {"type": "integer", "minimum": 0},
|
|
24
|
+
"authorities": {
|
|
25
|
+
"type": "array",
|
|
26
|
+
"minItems": 1,
|
|
27
|
+
"maxItems": 6,
|
|
28
|
+
"items": {"$ref": "#/$defs/authority"}
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"$defs": {
|
|
32
|
+
"authority": {
|
|
33
|
+
"type": "object",
|
|
34
|
+
"additionalProperties": false,
|
|
35
|
+
"required": [
|
|
36
|
+
"name", "exact_clause_count", "built_in_collector_clause_count",
|
|
37
|
+
"signed_import_supported_clause_count"
|
|
38
|
+
],
|
|
39
|
+
"properties": {
|
|
40
|
+
"name": {
|
|
41
|
+
"enum": ["artifact", "environment", "executed", "external_registry", "repository", "structured_record"]
|
|
42
|
+
},
|
|
43
|
+
"exact_clause_count": {"type": "integer", "minimum": 0},
|
|
44
|
+
"built_in_collector_clause_count": {"type": "integer", "minimum": 0},
|
|
45
|
+
"signed_import_supported_clause_count": {"type": "integer", "minimum": 0}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|