verirepro 0.8.1__tar.gz
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.
- verirepro-0.8.1/.gitattributes +14 -0
- verirepro-0.8.1/.github/CODEOWNERS +17 -0
- verirepro-0.8.1/.github/ISSUE_TEMPLATE/bug_report.yml +49 -0
- verirepro-0.8.1/.github/ISSUE_TEMPLATE/config.yml +5 -0
- verirepro-0.8.1/.github/ISSUE_TEMPLATE/feature_request.yml +31 -0
- verirepro-0.8.1/.github/ISSUE_TEMPLATE/reproduction_help.yml +81 -0
- verirepro-0.8.1/.github/PULL_REQUEST_TEMPLATE.md +31 -0
- verirepro-0.8.1/.github/dependabot.yml +29 -0
- verirepro-0.8.1/.github/release-signers +1 -0
- verirepro-0.8.1/.github/workflows/ci.yml +144 -0
- verirepro-0.8.1/.github/workflows/dependency-review.yml +23 -0
- verirepro-0.8.1/.github/workflows/publish.yml +149 -0
- verirepro-0.8.1/.github/workflows/validation.yml +130 -0
- verirepro-0.8.1/.gitignore +16 -0
- verirepro-0.8.1/CHANGELOG.md +121 -0
- verirepro-0.8.1/CITATION.cff +16 -0
- verirepro-0.8.1/CODE_OF_CONDUCT.md +22 -0
- verirepro-0.8.1/CONTRIBUTING.md +91 -0
- verirepro-0.8.1/LICENSE +175 -0
- verirepro-0.8.1/PKG-INFO +318 -0
- verirepro-0.8.1/README.md +279 -0
- verirepro-0.8.1/ROADMAP.md +107 -0
- verirepro-0.8.1/SECURITY.md +84 -0
- verirepro-0.8.1/SUPPORT.md +47 -0
- verirepro-0.8.1/benchmarks/certification-environment-0.8.0.json +59 -0
- verirepro-0.8.1/benchmarks/certification-environment-0.8.1.json +59 -0
- verirepro-0.8.1/benchmarks/environment-planning-results-0.8.0.json +258 -0
- verirepro-0.8.1/benchmarks/environment-planning-results-0.8.1.json +258 -0
- verirepro-0.8.1/benchmarks/real-paper-smoke-results-0.8.0.json +829 -0
- verirepro-0.8.1/benchmarks/real-paper-smoke-results-0.8.1.json +829 -0
- verirepro-0.8.1/benchmarks/real-paper-smoke.json +126 -0
- verirepro-0.8.1/benchmarks/reprobench-reference/cohomology-wall-section7.csv +23 -0
- verirepro-0.8.1/benchmarks/reprobench-results-0.8.0/manifest.json +44 -0
- verirepro-0.8.1/benchmarks/reprobench-results-0.8.0/results/cohomology-wall-smoke-v1.json +137 -0
- verirepro-0.8.1/benchmarks/reprobench-results-0.8.0/results/governed-individuation-mechanism-v1.json +132 -0
- verirepro-0.8.1/benchmarks/reprobench-results-0.8.0/summary.json +102 -0
- verirepro-0.8.1/benchmarks/reprobench-results-0.8.1/manifest.json +44 -0
- verirepro-0.8.1/benchmarks/reprobench-results-0.8.1/results/cohomology-wall-smoke-v1.json +137 -0
- verirepro-0.8.1/benchmarks/reprobench-results-0.8.1/results/governed-individuation-mechanism-v1.json +132 -0
- verirepro-0.8.1/benchmarks/reprobench-results-0.8.1/summary.json +102 -0
- verirepro-0.8.1/benchmarks/reprobench-seed/cohomology-wall.json +9 -0
- verirepro-0.8.1/benchmarks/reprobench-seed/governed-individuation.json +7 -0
- verirepro-0.8.1/benchmarks/reprobench-seed-suite.json +60 -0
- verirepro-0.8.1/constraints/certification.txt +50 -0
- verirepro-0.8.1/docs/ARCHITECTURE.md +151 -0
- verirepro-0.8.1/docs/CANONICAL_IDENTITY.md +20 -0
- verirepro-0.8.1/docs/DATASETS.md +152 -0
- verirepro-0.8.1/docs/ENVIRONMENT.md +71 -0
- verirepro-0.8.1/docs/ENVIRONMENT_MANAGERS.md +61 -0
- verirepro-0.8.1/docs/EVIDENCE.md +119 -0
- verirepro-0.8.1/docs/GETTING_STARTED.md +99 -0
- verirepro-0.8.1/docs/GPU.md +83 -0
- verirepro-0.8.1/docs/LITELLM.md +95 -0
- verirepro-0.8.1/docs/MODEL_ARTIFACTS.md +80 -0
- verirepro-0.8.1/docs/OUTPUTS.md +39 -0
- verirepro-0.8.1/docs/PUBLIC_RELEASE_CHECKLIST.md +111 -0
- verirepro-0.8.1/docs/PUBLISHING.md +195 -0
- verirepro-0.8.1/docs/REAL_PAPER_SMOKE.md +138 -0
- verirepro-0.8.1/docs/RELEASE_SIGNING.md +54 -0
- verirepro-0.8.1/docs/REPROBENCH.md +259 -0
- verirepro-0.8.1/docs/SCHEMAS.md +116 -0
- verirepro-0.8.1/docs/TRUST_MODEL.md +242 -0
- verirepro-0.8.1/examples/README.md +37 -0
- verirepro-0.8.1/examples/artifact-demo/references/figure3.ppm +7 -0
- verirepro-0.8.1/examples/artifact-demo/references/table2.csv +2 -0
- verirepro-0.8.1/examples/artifact-demo/reproagent.yaml +22 -0
- verirepro-0.8.1/examples/artifact-demo/reproduce.py +22 -0
- verirepro-0.8.1/examples/artifact-demo/verirepro.yaml +22 -0
- verirepro-0.8.1/examples/reproagent.yaml +32 -0
- verirepro-0.8.1/examples/verirepro.yaml +41 -0
- verirepro-0.8.1/pyproject.toml +98 -0
- verirepro-0.8.1/scripts/certification_environment_check.py +167 -0
- verirepro-0.8.1/scripts/coverage_gate.py +86 -0
- verirepro-0.8.1/scripts/history_scan.py +305 -0
- verirepro-0.8.1/scripts/launch_surface_check.py +181 -0
- verirepro-0.8.1/scripts/record_release_evidence.py +333 -0
- verirepro-0.8.1/scripts/release_check.py +89 -0
- verirepro-0.8.1/scripts/release_checks/__init__.py +1 -0
- verirepro-0.8.1/scripts/release_checks/action_pin.py +74 -0
- verirepro-0.8.1/scripts/release_checks/benchmark_surface.py +544 -0
- verirepro-0.8.1/scripts/release_checks/certification_surface.py +40 -0
- verirepro-0.8.1/scripts/release_checks/common.py +143 -0
- verirepro-0.8.1/scripts/release_checks/package_surface.py +213 -0
- verirepro-0.8.1/scripts/release_checks/public_contract_surface.py +141 -0
- verirepro-0.8.1/scripts/release_checks/security_surface.py +49 -0
- verirepro-0.8.1/scripts/release_checks/workflow_surface.py +240 -0
- verirepro-0.8.1/scripts/release_source_check.py +252 -0
- verirepro-0.8.1/scripts/run_llm_planning_smoke.py +297 -0
- verirepro-0.8.1/scripts/run_real_paper_smoke.py +404 -0
- verirepro-0.8.1/scripts/run_reprobench_seed.py +409 -0
- verirepro-0.8.1/scripts/stamp_release_measurement.py +131 -0
- verirepro-0.8.1/scripts/verify_release_tag.py +177 -0
- verirepro-0.8.1/src/reproagent/__init__.py +12 -0
- verirepro-0.8.1/src/reproagent/artifacts.py +394 -0
- verirepro-0.8.1/src/reproagent/cli.py +355 -0
- verirepro-0.8.1/src/reproagent/config.py +388 -0
- verirepro-0.8.1/src/reproagent/core.py +31 -0
- verirepro-0.8.1/src/reproagent/datasets.py +716 -0
- verirepro-0.8.1/src/reproagent/discovery.py +351 -0
- verirepro-0.8.1/src/reproagent/environment.py +558 -0
- verirepro-0.8.1/src/reproagent/experiment.py +352 -0
- verirepro-0.8.1/src/reproagent/intelligence.py +513 -0
- verirepro-0.8.1/src/reproagent/llm.py +327 -0
- verirepro-0.8.1/src/reproagent/metrics.py +114 -0
- verirepro-0.8.1/src/reproagent/model_artifacts.py +152 -0
- verirepro-0.8.1/src/reproagent/models.py +159 -0
- verirepro-0.8.1/src/reproagent/pipeline.py +547 -0
- verirepro-0.8.1/src/reproagent/pipeline_execution.py +121 -0
- verirepro-0.8.1/src/reproagent/pipeline_policy.py +160 -0
- verirepro-0.8.1/src/reproagent/pipeline_reporting.py +81 -0
- verirepro-0.8.1/src/reproagent/pipeline_verification.py +180 -0
- verirepro-0.8.1/src/reproagent/release_provenance.py +110 -0
- verirepro-0.8.1/src/reproagent/reporting.py +200 -0
- verirepro-0.8.1/src/reproagent/repository.py +424 -0
- verirepro-0.8.1/src/reproagent/repository_intelligence.py +268 -0
- verirepro-0.8.1/src/reproagent/reprobench_adapter.py +505 -0
- verirepro-0.8.1/src/reproagent/reprobench_summary.py +438 -0
- verirepro-0.8.1/src/reproagent/sources.py +312 -0
- verirepro-0.8.1/src/reproagent/usage.py +100 -0
- verirepro-0.8.1/src/reproagent/workspaces.py +27 -0
- verirepro-0.8.1/src/verirepro/__init__.py +10 -0
- verirepro-0.8.1/src/verirepro/__main__.py +6 -0
- verirepro-0.8.1/src/verirepro/cli.py +5 -0
- verirepro-0.8.1/src/verirepro/py.typed +0 -0
- verirepro-0.8.1/src/verirepro/reprobench.py +42 -0
- verirepro-0.8.1/tests/test_action_pin.py +93 -0
- verirepro-0.8.1/tests/test_artifacts_integrity.py +774 -0
- verirepro-0.8.1/tests/test_certification_environment.py +39 -0
- verirepro-0.8.1/tests/test_certification_surface.py +88 -0
- verirepro-0.8.1/tests/test_cli_dispatch.py +801 -0
- verirepro-0.8.1/tests/test_coverage_gate.py +56 -0
- verirepro-0.8.1/tests/test_datasets.py +129 -0
- verirepro-0.8.1/tests/test_datasets_downloads.py +938 -0
- verirepro-0.8.1/tests/test_discovery.py +134 -0
- verirepro-0.8.1/tests/test_environment.py +208 -0
- verirepro-0.8.1/tests/test_environment_failures.py +699 -0
- verirepro-0.8.1/tests/test_experiment.py +31 -0
- verirepro-0.8.1/tests/test_failure_matrix.py +139 -0
- verirepro-0.8.1/tests/test_gpu_policy_v08.py +114 -0
- verirepro-0.8.1/tests/test_history_scan.py +131 -0
- verirepro-0.8.1/tests/test_intelligence.py +201 -0
- verirepro-0.8.1/tests/test_launch_surface_check.py +158 -0
- verirepro-0.8.1/tests/test_llm_client_contract.py +594 -0
- verirepro-0.8.1/tests/test_llm_error_redaction.py +35 -0
- verirepro-0.8.1/tests/test_manifest_untrusted_input_safety.py +104 -0
- verirepro-0.8.1/tests/test_metrics.py +33 -0
- verirepro-0.8.1/tests/test_model_artifacts_v08.py +194 -0
- verirepro-0.8.1/tests/test_package_support_contract.py +32 -0
- verirepro-0.8.1/tests/test_pipeline.py +189 -0
- verirepro-0.8.1/tests/test_pipeline_execution.py +148 -0
- verirepro-0.8.1/tests/test_pipeline_verification.py +233 -0
- verirepro-0.8.1/tests/test_public_ci_contract.py +228 -0
- verirepro-0.8.1/tests/test_public_contract_surface.py +85 -0
- verirepro-0.8.1/tests/test_public_namespace.py +33 -0
- verirepro-0.8.1/tests/test_python_compatibility_workflow_contract.py +49 -0
- verirepro-0.8.1/tests/test_release_check_layers.py +301 -0
- verirepro-0.8.1/tests/test_release_source_identity.py +264 -0
- verirepro-0.8.1/tests/test_release_tag_verification.py +175 -0
- verirepro-0.8.1/tests/test_reporting_render.py +438 -0
- verirepro-0.8.1/tests/test_repository_security.py +137 -0
- verirepro-0.8.1/tests/test_reprobench_entrypoints.py +1178 -0
- verirepro-0.8.1/tests/test_reprobench_release_contract.py +94 -0
- verirepro-0.8.1/tests/test_runtime_nonroot_v08.py +151 -0
- verirepro-0.8.1/tests/test_runtime_readonly_v08.py +117 -0
- verirepro-0.8.1/tests/test_source_security.py +104 -0
- verirepro-0.8.1/tests/test_sources_acquisition.py +730 -0
- verirepro-0.8.1/tests/test_usage_accounting.py +199 -0
- verirepro-0.8.1/tests/test_version.py +10 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Normalize line endings so release-source fingerprints and evidence
|
|
2
|
+
# SHA-256 digests are stable across platforms. Release-relevant files
|
|
3
|
+
# (Python sources, TOML metadata, release/measurement scripts, and all
|
|
4
|
+
# benchmark evidence JSON) must stay LF in every working tree; Windows
|
|
5
|
+
# checkouts otherwise rewrite them to CRLF and change read_bytes() digests.
|
|
6
|
+
*.py text eol=lf
|
|
7
|
+
*.toml text eol=lf
|
|
8
|
+
*.json text eol=lf
|
|
9
|
+
*.yml text eol=lf
|
|
10
|
+
*.yaml text eol=lf
|
|
11
|
+
*.cff text eol=lf
|
|
12
|
+
*.md text eol=lf
|
|
13
|
+
*.sh text eol=lf
|
|
14
|
+
*.csv text eol=lf
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Default maintainer ownership
|
|
2
|
+
* @XiantingWu
|
|
3
|
+
|
|
4
|
+
# Security, trust, execution, and release boundaries
|
|
5
|
+
/SECURITY.md @XiantingWu
|
|
6
|
+
/docs/TRUST_MODEL.md @XiantingWu
|
|
7
|
+
/docs/RELEASE_SIGNING.md @XiantingWu
|
|
8
|
+
/docs/PUBLISHING.md @XiantingWu
|
|
9
|
+
/.github/release-signers @XiantingWu
|
|
10
|
+
/.github/dependabot.yml @XiantingWu
|
|
11
|
+
/.github/workflows/ @XiantingWu
|
|
12
|
+
/scripts/release_check.py @XiantingWu
|
|
13
|
+
/scripts/release_checks/ @XiantingWu
|
|
14
|
+
/scripts/release_source_check.py @XiantingWu
|
|
15
|
+
/scripts/launch_surface_check.py @XiantingWu
|
|
16
|
+
/src/reproagent/ @XiantingWu
|
|
17
|
+
/src/verirepro/ @XiantingWu
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
name: Bug report
|
|
2
|
+
description: Report a reproducible VeriRepro defect
|
|
3
|
+
title: "[bug] "
|
|
4
|
+
labels: ["bug"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
Please remove credentials, unpublished paper content, and sensitive dataset URLs before posting.
|
|
10
|
+
- type: textarea
|
|
11
|
+
id: summary
|
|
12
|
+
attributes:
|
|
13
|
+
label: What happened?
|
|
14
|
+
description: Describe the observed behavior and what you expected instead.
|
|
15
|
+
validations:
|
|
16
|
+
required: true
|
|
17
|
+
- type: input
|
|
18
|
+
id: version
|
|
19
|
+
attributes:
|
|
20
|
+
label: VeriRepro version
|
|
21
|
+
placeholder: "verirepro --version"
|
|
22
|
+
validations:
|
|
23
|
+
required: true
|
|
24
|
+
- type: textarea
|
|
25
|
+
id: command
|
|
26
|
+
attributes:
|
|
27
|
+
label: Command
|
|
28
|
+
description: Redact secrets and private URLs.
|
|
29
|
+
render: shell
|
|
30
|
+
validations:
|
|
31
|
+
required: true
|
|
32
|
+
- type: textarea
|
|
33
|
+
id: diagnostics
|
|
34
|
+
attributes:
|
|
35
|
+
label: Diagnostics
|
|
36
|
+
description: Paste `verirepro doctor --json` output after checking it for sensitive values.
|
|
37
|
+
render: json
|
|
38
|
+
- type: textarea
|
|
39
|
+
id: report
|
|
40
|
+
attributes:
|
|
41
|
+
label: Relevant report excerpt
|
|
42
|
+
description: Include stage names/statuses or a minimal sanitized report excerpt.
|
|
43
|
+
- type: checkboxes
|
|
44
|
+
id: safety
|
|
45
|
+
attributes:
|
|
46
|
+
label: Safety check
|
|
47
|
+
options:
|
|
48
|
+
- label: I removed API keys, access tokens, private repository URLs, and sensitive unpublished data.
|
|
49
|
+
required: true
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
name: Feature request
|
|
2
|
+
description: Propose a bounded, testable VeriRepro capability
|
|
3
|
+
title: "[feature] "
|
|
4
|
+
labels: ["enhancement"]
|
|
5
|
+
body:
|
|
6
|
+
- type: textarea
|
|
7
|
+
id: problem
|
|
8
|
+
attributes:
|
|
9
|
+
label: Reproduction problem
|
|
10
|
+
description: What concrete reproducibility workflow is blocked today?
|
|
11
|
+
validations:
|
|
12
|
+
required: true
|
|
13
|
+
- type: textarea
|
|
14
|
+
id: evidence
|
|
15
|
+
attributes:
|
|
16
|
+
label: Desired evidence contract
|
|
17
|
+
description: What inputs, deterministic checks, and outputs should make this feature auditable?
|
|
18
|
+
validations:
|
|
19
|
+
required: true
|
|
20
|
+
- type: textarea
|
|
21
|
+
id: example
|
|
22
|
+
attributes:
|
|
23
|
+
label: Minimal example
|
|
24
|
+
description: Provide a public paper/repository example if possible.
|
|
25
|
+
- type: checkboxes
|
|
26
|
+
id: trust
|
|
27
|
+
attributes:
|
|
28
|
+
label: Trust-boundary impact
|
|
29
|
+
options:
|
|
30
|
+
- label: I considered whether this expands LLM execution authority, host networking, filesystem access, or secret exposure.
|
|
31
|
+
required: true
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
name: Reproduction help
|
|
2
|
+
description: Ask for help diagnosing a paper/repository reproduction without assuming it is a VeriRepro bug
|
|
3
|
+
title: "[reproduction] "
|
|
4
|
+
body:
|
|
5
|
+
- type: markdown
|
|
6
|
+
attributes:
|
|
7
|
+
value: |
|
|
8
|
+
Use this form when a paper or repository does not plan/reproduce as expected and you are not yet sure whether the problem is a VeriRepro defect. Remove credentials, private URLs, unpublished content, and sensitive dataset/model information before posting.
|
|
9
|
+
- type: input
|
|
10
|
+
id: paper
|
|
11
|
+
attributes:
|
|
12
|
+
label: Paper reference
|
|
13
|
+
description: Public arXiv ID/URL, DOI, or public PDF URL. Do not post unpublished/private paper content.
|
|
14
|
+
placeholder: "2103.00020v1"
|
|
15
|
+
validations:
|
|
16
|
+
required: true
|
|
17
|
+
- type: input
|
|
18
|
+
id: version
|
|
19
|
+
attributes:
|
|
20
|
+
label: VeriRepro version
|
|
21
|
+
placeholder: "verirepro --version"
|
|
22
|
+
validations:
|
|
23
|
+
required: true
|
|
24
|
+
- type: dropdown
|
|
25
|
+
id: stage
|
|
26
|
+
attributes:
|
|
27
|
+
label: Where does the problem occur?
|
|
28
|
+
options:
|
|
29
|
+
- Paper/source resolution
|
|
30
|
+
- Repository discovery
|
|
31
|
+
- Repository inspection
|
|
32
|
+
- Environment planning/build
|
|
33
|
+
- Dataset or model artifact materialization
|
|
34
|
+
- Experiment execution
|
|
35
|
+
- Metric/artifact verification
|
|
36
|
+
- Report/evidence output
|
|
37
|
+
- ReproBench
|
|
38
|
+
- Unsure
|
|
39
|
+
validations:
|
|
40
|
+
required: true
|
|
41
|
+
- type: textarea
|
|
42
|
+
id: goal
|
|
43
|
+
attributes:
|
|
44
|
+
label: What are you trying to reproduce?
|
|
45
|
+
description: Describe the expected scientific/output target and what evidence you have for it.
|
|
46
|
+
validations:
|
|
47
|
+
required: true
|
|
48
|
+
- type: textarea
|
|
49
|
+
id: command
|
|
50
|
+
attributes:
|
|
51
|
+
label: Command
|
|
52
|
+
description: Paste the exact command after removing secrets and private URLs.
|
|
53
|
+
render: shell
|
|
54
|
+
validations:
|
|
55
|
+
required: true
|
|
56
|
+
- type: textarea
|
|
57
|
+
id: diagnostics
|
|
58
|
+
attributes:
|
|
59
|
+
label: Diagnostics
|
|
60
|
+
description: Paste sanitized `verirepro doctor --json` output when relevant.
|
|
61
|
+
render: json
|
|
62
|
+
- type: textarea
|
|
63
|
+
id: report
|
|
64
|
+
attributes:
|
|
65
|
+
label: Relevant report or error excerpt
|
|
66
|
+
description: Include stage names/statuses or a small sanitized excerpt. Do not paste huge logs.
|
|
67
|
+
- type: input
|
|
68
|
+
id: environment
|
|
69
|
+
attributes:
|
|
70
|
+
label: Environment
|
|
71
|
+
description: OS, Python version, Docker availability/version, and GPU only if relevant.
|
|
72
|
+
placeholder: "macOS 15, Python 3.11, Docker Desktop ..."
|
|
73
|
+
- type: checkboxes
|
|
74
|
+
id: safety
|
|
75
|
+
attributes:
|
|
76
|
+
label: Safety and scope
|
|
77
|
+
options:
|
|
78
|
+
- label: I removed API keys, access tokens, private repository/endpoint URLs, and sensitive unpublished data.
|
|
79
|
+
required: true
|
|
80
|
+
- label: I understand that an unavailable/underspecified upstream research artifact may remain non-reproducible rather than being filled in with guesses.
|
|
81
|
+
required: true
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
## Summary
|
|
2
|
+
|
|
3
|
+
<!-- What changes and why? -->
|
|
4
|
+
|
|
5
|
+
## Evidence / verification
|
|
6
|
+
|
|
7
|
+
<!-- Tests, fixture, paper/repository case, or report artifact that verifies the change. -->
|
|
8
|
+
|
|
9
|
+
## Trust-boundary checklist
|
|
10
|
+
|
|
11
|
+
- [ ] This does not silently broaden model-generated shell authority.
|
|
12
|
+
- [ ] Host filesystem/network access is unchanged or explicitly documented and tested.
|
|
13
|
+
- [ ] Secrets are not passed into third-party experiment containers.
|
|
14
|
+
- [ ] New external downloads have size/integrity/redirect controls where applicable.
|
|
15
|
+
- [ ] PASS/FAIL evidence remains deterministic and auditable.
|
|
16
|
+
|
|
17
|
+
## Public quality checks
|
|
18
|
+
|
|
19
|
+
- [ ] `ruff check src tests scripts`
|
|
20
|
+
- [ ] `mypy`
|
|
21
|
+
- [ ] `pytest -q`
|
|
22
|
+
- [ ] `python scripts/release_check.py`
|
|
23
|
+
- [ ] `python scripts/launch_surface_check.py`
|
|
24
|
+
- [ ] `verirepro doctor --json`
|
|
25
|
+
|
|
26
|
+
## Release-facing changes
|
|
27
|
+
|
|
28
|
+
<!-- Leave these unchecked when the change does not alter release-relevant source/policy. -->
|
|
29
|
+
|
|
30
|
+
- [ ] If this changes runtime/package/measurement/release-policy/workflow bytes, I understand prior trusted release evidence becomes stale until maintainers regenerate exact-head evidence.
|
|
31
|
+
- [ ] If this changes a public API/schema, compatibility and migration impact are documented and tested.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
- package-ecosystem: "pip"
|
|
4
|
+
directory: "/"
|
|
5
|
+
schedule:
|
|
6
|
+
interval: "weekly"
|
|
7
|
+
open-pull-requests-limit: 5
|
|
8
|
+
# Routine version updates are limited to minor and patch releases.
|
|
9
|
+
# Dependabot security updates remain eligible and are not suppressed by
|
|
10
|
+
# this version-update restriction.
|
|
11
|
+
allow:
|
|
12
|
+
- dependency-name: "*"
|
|
13
|
+
update-types:
|
|
14
|
+
- "version-update:semver-minor"
|
|
15
|
+
- "version-update:semver-patch"
|
|
16
|
+
|
|
17
|
+
- package-ecosystem: "github-actions"
|
|
18
|
+
directory: "/"
|
|
19
|
+
schedule:
|
|
20
|
+
interval: "weekly"
|
|
21
|
+
open-pull-requests-limit: 5
|
|
22
|
+
# Workflow bytes are release-fingerprinted. Routine version updates are
|
|
23
|
+
# limited to minor and patch releases; Dependabot security updates remain
|
|
24
|
+
# eligible and are not suppressed by this version-update restriction.
|
|
25
|
+
allow:
|
|
26
|
+
- dependency-name: "*"
|
|
27
|
+
update-types:
|
|
28
|
+
- "version-update:semver-minor"
|
|
29
|
+
- "version-update:semver-patch"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
XiantingWu ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBJfd2L8YpF6JsPmYTIrogGw4RYjQttQg3ipeQMpALe8
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
push:
|
|
6
|
+
branches: [main]
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
concurrency:
|
|
12
|
+
group: ci-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
|
13
|
+
cancel-in-progress: true
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
quality-py311:
|
|
17
|
+
name: Quality (Python 3.11)
|
|
18
|
+
runs-on: ubuntu-latest
|
|
19
|
+
timeout-minutes: 45
|
|
20
|
+
steps:
|
|
21
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
22
|
+
with:
|
|
23
|
+
persist-credentials: false
|
|
24
|
+
fetch-depth: 0
|
|
25
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
|
26
|
+
with:
|
|
27
|
+
python-version: '3.11'
|
|
28
|
+
cache: pip
|
|
29
|
+
- name: Install
|
|
30
|
+
run: |
|
|
31
|
+
set -euo pipefail
|
|
32
|
+
export PIP_CONSTRAINT="$GITHUB_WORKSPACE/constraints/certification.txt"
|
|
33
|
+
python -m pip install -c "$PIP_CONSTRAINT" 'pip==26.2.1'
|
|
34
|
+
python -m pip install -c "$PIP_CONSTRAINT" 'hatchling==1.32.0'
|
|
35
|
+
python -m pip install -c "$PIP_CONSTRAINT" -e '.[dev]'
|
|
36
|
+
- name: Ruff check
|
|
37
|
+
run: ruff check .
|
|
38
|
+
- name: Ruff format
|
|
39
|
+
run: ruff format --check .
|
|
40
|
+
- name: mypy
|
|
41
|
+
run: mypy
|
|
42
|
+
- name: Tests with branch coverage
|
|
43
|
+
run: |
|
|
44
|
+
python -m pytest -q --cov=reproagent --cov=verirepro --cov-branch --cov-report=json
|
|
45
|
+
- name: Coverage gate
|
|
46
|
+
run: python scripts/coverage_gate.py coverage.json --min-statement 85 --min-branch 75
|
|
47
|
+
- name: History scan
|
|
48
|
+
run: python scripts/history_scan.py --ref HEAD
|
|
49
|
+
- name: Release check
|
|
50
|
+
run: python scripts/release_check.py
|
|
51
|
+
- name: Launch surface
|
|
52
|
+
run: python scripts/launch_surface_check.py
|
|
53
|
+
- name: Build distributions
|
|
54
|
+
run: |
|
|
55
|
+
set -euo pipefail
|
|
56
|
+
rm -rf dist build
|
|
57
|
+
python -m build
|
|
58
|
+
python -m twine check dist/*
|
|
59
|
+
test "$(find dist -maxdepth 1 -type f -name '*.whl' | wc -l | tr -d ' ')" = "1"
|
|
60
|
+
test "$(find dist -maxdepth 1 -type f -name '*.tar.gz' | wc -l | tr -d ' ')" = "1"
|
|
61
|
+
- name: Clean-wheel verification
|
|
62
|
+
run: |
|
|
63
|
+
set -euo pipefail
|
|
64
|
+
CHECK_VENV="$RUNNER_TEMP/verirepro-ci-wheel-${GITHUB_RUN_ID}"
|
|
65
|
+
rm -rf "$CHECK_VENV"
|
|
66
|
+
trap 'rm -rf "$CHECK_VENV"' EXIT
|
|
67
|
+
python -m venv "$CHECK_VENV"
|
|
68
|
+
"$CHECK_VENV/bin/python" -m pip install 'pip==26.2.1'
|
|
69
|
+
WHEEL="$(find dist -maxdepth 1 -type f -name 'verirepro-*.whl' -print -quit)"
|
|
70
|
+
"$CHECK_VENV/bin/python" -m pip install "$WHEEL"
|
|
71
|
+
"$CHECK_VENV/bin/python" -m pip check
|
|
72
|
+
"$CHECK_VENV/bin/verirepro" --version
|
|
73
|
+
"$CHECK_VENV/bin/python" -m verirepro --version
|
|
74
|
+
"$CHECK_VENV/bin/verirepro-reprobench" --help >/dev/null
|
|
75
|
+
"$CHECK_VENV/bin/verirepro-reprobench-summary" --help >/dev/null
|
|
76
|
+
"$CHECK_VENV/bin/verirepro" doctor --json >/dev/null
|
|
77
|
+
- name: Clean-sdist verification
|
|
78
|
+
run: |
|
|
79
|
+
set -euo pipefail
|
|
80
|
+
CHECK_VENV="$RUNNER_TEMP/verirepro-ci-sdist-${GITHUB_RUN_ID}"
|
|
81
|
+
rm -rf "$CHECK_VENV"
|
|
82
|
+
trap 'rm -rf "$CHECK_VENV"' EXIT
|
|
83
|
+
python -m venv "$CHECK_VENV"
|
|
84
|
+
"$CHECK_VENV/bin/python" -m pip install 'pip==26.2.1'
|
|
85
|
+
SDIST="$(find dist -maxdepth 1 -type f -name 'verirepro-*.tar.gz' -print -quit)"
|
|
86
|
+
test -n "$SDIST"
|
|
87
|
+
"$CHECK_VENV/bin/python" -m pip install "$SDIST"
|
|
88
|
+
"$CHECK_VENV/bin/python" -m pip check
|
|
89
|
+
"$CHECK_VENV/bin/verirepro" --version
|
|
90
|
+
"$CHECK_VENV/bin/python" -m verirepro --version
|
|
91
|
+
"$CHECK_VENV/bin/verirepro-reprobench" --help >/dev/null
|
|
92
|
+
"$CHECK_VENV/bin/verirepro-reprobench-summary" --help >/dev/null
|
|
93
|
+
"$CHECK_VENV/bin/verirepro" doctor --json >/dev/null
|
|
94
|
+
- name: CLI surface
|
|
95
|
+
run: |
|
|
96
|
+
verirepro --version
|
|
97
|
+
python -m verirepro --version
|
|
98
|
+
verirepro-reprobench --help >/dev/null
|
|
99
|
+
verirepro-reprobench-summary --help >/dev/null
|
|
100
|
+
verirepro doctor --json >/dev/null
|
|
101
|
+
|
|
102
|
+
compatibility-py312:
|
|
103
|
+
name: Compatibility (Python 3.12)
|
|
104
|
+
runs-on: ubuntu-latest
|
|
105
|
+
timeout-minutes: 30
|
|
106
|
+
steps:
|
|
107
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
108
|
+
with:
|
|
109
|
+
persist-credentials: false
|
|
110
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
|
111
|
+
with:
|
|
112
|
+
python-version: '3.12'
|
|
113
|
+
cache: pip
|
|
114
|
+
- name: Install
|
|
115
|
+
run: python -m pip install -e '.[dev]'
|
|
116
|
+
- name: Full pytest suite
|
|
117
|
+
run: python -m pytest -q
|
|
118
|
+
- name: Import and CLI surface
|
|
119
|
+
run: |
|
|
120
|
+
python -c 'import verirepro, reproagent'
|
|
121
|
+
verirepro --version
|
|
122
|
+
python -m verirepro --version
|
|
123
|
+
|
|
124
|
+
compatibility-py313:
|
|
125
|
+
name: Compatibility (Python 3.13)
|
|
126
|
+
runs-on: ubuntu-latest
|
|
127
|
+
timeout-minutes: 30
|
|
128
|
+
steps:
|
|
129
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
130
|
+
with:
|
|
131
|
+
persist-credentials: false
|
|
132
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
|
133
|
+
with:
|
|
134
|
+
python-version: '3.13'
|
|
135
|
+
cache: pip
|
|
136
|
+
- name: Install
|
|
137
|
+
run: python -m pip install -e '.[dev]'
|
|
138
|
+
- name: Full pytest suite
|
|
139
|
+
run: python -m pytest -q
|
|
140
|
+
- name: Import and CLI surface
|
|
141
|
+
run: |
|
|
142
|
+
python -c 'import verirepro, reproagent'
|
|
143
|
+
verirepro --version
|
|
144
|
+
python -m verirepro --version
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
name: Dependency Review
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
|
|
6
|
+
permissions:
|
|
7
|
+
contents: read
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
dependency-review:
|
|
11
|
+
name: Dependency Review
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
timeout-minutes: 15
|
|
14
|
+
permissions:
|
|
15
|
+
contents: read
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
18
|
+
with:
|
|
19
|
+
persist-credentials: false
|
|
20
|
+
- name: Review dependency changes
|
|
21
|
+
uses: actions/dependency-review-action@a1d282b36b6f3519aa1f3fc636f609c47dddb294 # v5.0.0
|
|
22
|
+
with:
|
|
23
|
+
fail-on-severity: high
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
name: Publish
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: read
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
build:
|
|
12
|
+
name: Test, build, and verify distributions
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
timeout-minutes: 60
|
|
15
|
+
permissions:
|
|
16
|
+
contents: read
|
|
17
|
+
steps:
|
|
18
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
19
|
+
with:
|
|
20
|
+
persist-credentials: false
|
|
21
|
+
fetch-depth: 0
|
|
22
|
+
ref: ${{ github.event.release.tag_name }}
|
|
23
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
|
24
|
+
with:
|
|
25
|
+
python-version: '3.13'
|
|
26
|
+
- name: Require release tag to match pyproject version
|
|
27
|
+
run: |
|
|
28
|
+
set -euo pipefail
|
|
29
|
+
VERSION="$(python - <<'PY'
|
|
30
|
+
import tomllib
|
|
31
|
+
from pathlib import Path
|
|
32
|
+
data = tomllib.loads(Path('pyproject.toml').read_text(encoding='utf-8'))
|
|
33
|
+
print(data['project']['version'])
|
|
34
|
+
PY
|
|
35
|
+
)"
|
|
36
|
+
test "${GITHUB_REF_NAME}" = "v${VERSION}" || {
|
|
37
|
+
echo "Release tag ${GITHUB_REF_NAME} does not match pyproject version v${VERSION}" >&2
|
|
38
|
+
exit 2
|
|
39
|
+
}
|
|
40
|
+
- name: Require cryptographically signed annotated tag at current canonical main head
|
|
41
|
+
run: |
|
|
42
|
+
set -euo pipefail
|
|
43
|
+
git fetch --force origin main
|
|
44
|
+
test "$(git cat-file -t "$GITHUB_REF_NAME")" = tag || {
|
|
45
|
+
echo 'Stable publication requires a pre-created annotated tag.' >&2
|
|
46
|
+
exit 2
|
|
47
|
+
}
|
|
48
|
+
python scripts/verify_release_tag.py \
|
|
49
|
+
--tag "$GITHUB_REF_NAME" \
|
|
50
|
+
--allowed-signers .github/release-signers \
|
|
51
|
+
--expected-principal XiantingWu
|
|
52
|
+
TAG_COMMIT="$(git rev-parse "${GITHUB_REF_NAME}^{commit}")"
|
|
53
|
+
HEAD_COMMIT="$(git rev-parse HEAD)"
|
|
54
|
+
test "$TAG_COMMIT" = "$HEAD_COMMIT" || {
|
|
55
|
+
echo 'Release checkout does not match the dereferenced tag commit.' >&2
|
|
56
|
+
exit 2
|
|
57
|
+
}
|
|
58
|
+
MAIN_COMMIT="$(git rev-parse origin/main)"
|
|
59
|
+
test "$TAG_COMMIT" = "$MAIN_COMMIT" || {
|
|
60
|
+
echo 'Stable release tag must identify the current canonical main head.' >&2
|
|
61
|
+
exit 2
|
|
62
|
+
}
|
|
63
|
+
git merge-base --is-ancestor "$TAG_COMMIT" origin/main || {
|
|
64
|
+
echo 'Release tag commit is not reachable from canonical main.' >&2
|
|
65
|
+
exit 2
|
|
66
|
+
}
|
|
67
|
+
- name: Run release source and evidence gates
|
|
68
|
+
run: |
|
|
69
|
+
set -euo pipefail
|
|
70
|
+
export PIP_CONSTRAINT="$GITHUB_WORKSPACE/constraints/certification.txt"
|
|
71
|
+
echo "PIP_CONSTRAINT=$PIP_CONSTRAINT" >> "$GITHUB_ENV"
|
|
72
|
+
python -m pip install -c "$PIP_CONSTRAINT" 'pip==26.2.1'
|
|
73
|
+
python -m pip install -c "$PIP_CONSTRAINT" 'hatchling==1.32.0'
|
|
74
|
+
python -m pip install -c "$PIP_CONSTRAINT" -e '.[dev]'
|
|
75
|
+
python scripts/certification_environment_check.py --constraints "$PIP_CONSTRAINT" >/dev/null
|
|
76
|
+
python -m pytest -q
|
|
77
|
+
python scripts/history_scan.py --ref origin/main --include-tree HEAD
|
|
78
|
+
python scripts/launch_surface_check.py
|
|
79
|
+
python scripts/release_check.py --require-release-evidence
|
|
80
|
+
python scripts/release_source_check.py
|
|
81
|
+
verirepro --version
|
|
82
|
+
python -m verirepro --version
|
|
83
|
+
verirepro-reprobench --help >/dev/null
|
|
84
|
+
verirepro-reprobench-summary --help >/dev/null
|
|
85
|
+
- name: Build and check wheel and sdist
|
|
86
|
+
run: |
|
|
87
|
+
set -euo pipefail
|
|
88
|
+
rm -rf dist build
|
|
89
|
+
python -m build
|
|
90
|
+
python -m twine check dist/*
|
|
91
|
+
test "$(find dist -maxdepth 1 -type f -name '*.whl' | wc -l | tr -d ' ')" = "1"
|
|
92
|
+
test "$(find dist -maxdepth 1 -type f -name '*.tar.gz' | wc -l | tr -d ' ')" = "1"
|
|
93
|
+
- name: Install built wheel in an isolated environment
|
|
94
|
+
run: |
|
|
95
|
+
set -euo pipefail
|
|
96
|
+
CHECK_VENV="$RUNNER_TEMP/verirepro-publish-wheel-${GITHUB_RUN_ID}"
|
|
97
|
+
rm -rf "$CHECK_VENV"
|
|
98
|
+
trap 'rm -rf "$CHECK_VENV"' EXIT
|
|
99
|
+
python -m venv "$CHECK_VENV"
|
|
100
|
+
"$CHECK_VENV/bin/python" -m pip install -c "$PIP_CONSTRAINT" 'pip==26.2.1'
|
|
101
|
+
WHEEL="$(find dist -maxdepth 1 -type f -name 'verirepro-*.whl' -print -quit)"
|
|
102
|
+
"$CHECK_VENV/bin/python" -m pip install -c "$PIP_CONSTRAINT" "$WHEEL"
|
|
103
|
+
"$CHECK_VENV/bin/python" -m pip check
|
|
104
|
+
"$CHECK_VENV/bin/verirepro" --version
|
|
105
|
+
"$CHECK_VENV/bin/python" -m verirepro --version
|
|
106
|
+
"$CHECK_VENV/bin/verirepro-reprobench" --help >/dev/null
|
|
107
|
+
"$CHECK_VENV/bin/verirepro-reprobench-summary" --help >/dev/null
|
|
108
|
+
"$CHECK_VENV/bin/verirepro" doctor --json >/dev/null
|
|
109
|
+
- name: Install built sdist in an independent isolated environment
|
|
110
|
+
run: |
|
|
111
|
+
set -euo pipefail
|
|
112
|
+
CHECK_VENV="$RUNNER_TEMP/verirepro-publish-sdist-${GITHUB_RUN_ID}"
|
|
113
|
+
rm -rf "$CHECK_VENV"
|
|
114
|
+
trap 'rm -rf "$CHECK_VENV"' EXIT
|
|
115
|
+
python -m venv "$CHECK_VENV"
|
|
116
|
+
"$CHECK_VENV/bin/python" -m pip install -c "$PIP_CONSTRAINT" 'pip==26.2.1'
|
|
117
|
+
SDIST="$(find dist -maxdepth 1 -type f -name 'verirepro-*.tar.gz' -print -quit)"
|
|
118
|
+
test -n "$SDIST"
|
|
119
|
+
"$CHECK_VENV/bin/python" -m pip install -c "$PIP_CONSTRAINT" "$SDIST"
|
|
120
|
+
"$CHECK_VENV/bin/python" -m pip check
|
|
121
|
+
"$CHECK_VENV/bin/verirepro" --version
|
|
122
|
+
"$CHECK_VENV/bin/python" -m verirepro --version
|
|
123
|
+
"$CHECK_VENV/bin/verirepro-reprobench" --help >/dev/null
|
|
124
|
+
"$CHECK_VENV/bin/verirepro-reprobench-summary" --help >/dev/null
|
|
125
|
+
"$CHECK_VENV/bin/verirepro" doctor --json >/dev/null
|
|
126
|
+
- name: Upload distributions
|
|
127
|
+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
128
|
+
with:
|
|
129
|
+
name: verirepro-dist-${{ github.run_id }}
|
|
130
|
+
path: dist/
|
|
131
|
+
|
|
132
|
+
publish:
|
|
133
|
+
name: Publish to PyPI via Trusted Publishing
|
|
134
|
+
needs: build
|
|
135
|
+
if: ${{ github.event.release.prerelease == false }}
|
|
136
|
+
runs-on: ubuntu-latest
|
|
137
|
+
timeout-minutes: 15
|
|
138
|
+
environment:
|
|
139
|
+
name: pypi
|
|
140
|
+
permissions:
|
|
141
|
+
contents: read
|
|
142
|
+
id-token: write
|
|
143
|
+
steps:
|
|
144
|
+
- uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0
|
|
145
|
+
with:
|
|
146
|
+
name: verirepro-dist-${{ github.run_id }}
|
|
147
|
+
path: dist/
|
|
148
|
+
- name: Publish package distributions to PyPI
|
|
149
|
+
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2 dereferenced release commit
|