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.
Files changed (168) hide show
  1. verirepro-0.8.1/.gitattributes +14 -0
  2. verirepro-0.8.1/.github/CODEOWNERS +17 -0
  3. verirepro-0.8.1/.github/ISSUE_TEMPLATE/bug_report.yml +49 -0
  4. verirepro-0.8.1/.github/ISSUE_TEMPLATE/config.yml +5 -0
  5. verirepro-0.8.1/.github/ISSUE_TEMPLATE/feature_request.yml +31 -0
  6. verirepro-0.8.1/.github/ISSUE_TEMPLATE/reproduction_help.yml +81 -0
  7. verirepro-0.8.1/.github/PULL_REQUEST_TEMPLATE.md +31 -0
  8. verirepro-0.8.1/.github/dependabot.yml +29 -0
  9. verirepro-0.8.1/.github/release-signers +1 -0
  10. verirepro-0.8.1/.github/workflows/ci.yml +144 -0
  11. verirepro-0.8.1/.github/workflows/dependency-review.yml +23 -0
  12. verirepro-0.8.1/.github/workflows/publish.yml +149 -0
  13. verirepro-0.8.1/.github/workflows/validation.yml +130 -0
  14. verirepro-0.8.1/.gitignore +16 -0
  15. verirepro-0.8.1/CHANGELOG.md +121 -0
  16. verirepro-0.8.1/CITATION.cff +16 -0
  17. verirepro-0.8.1/CODE_OF_CONDUCT.md +22 -0
  18. verirepro-0.8.1/CONTRIBUTING.md +91 -0
  19. verirepro-0.8.1/LICENSE +175 -0
  20. verirepro-0.8.1/PKG-INFO +318 -0
  21. verirepro-0.8.1/README.md +279 -0
  22. verirepro-0.8.1/ROADMAP.md +107 -0
  23. verirepro-0.8.1/SECURITY.md +84 -0
  24. verirepro-0.8.1/SUPPORT.md +47 -0
  25. verirepro-0.8.1/benchmarks/certification-environment-0.8.0.json +59 -0
  26. verirepro-0.8.1/benchmarks/certification-environment-0.8.1.json +59 -0
  27. verirepro-0.8.1/benchmarks/environment-planning-results-0.8.0.json +258 -0
  28. verirepro-0.8.1/benchmarks/environment-planning-results-0.8.1.json +258 -0
  29. verirepro-0.8.1/benchmarks/real-paper-smoke-results-0.8.0.json +829 -0
  30. verirepro-0.8.1/benchmarks/real-paper-smoke-results-0.8.1.json +829 -0
  31. verirepro-0.8.1/benchmarks/real-paper-smoke.json +126 -0
  32. verirepro-0.8.1/benchmarks/reprobench-reference/cohomology-wall-section7.csv +23 -0
  33. verirepro-0.8.1/benchmarks/reprobench-results-0.8.0/manifest.json +44 -0
  34. verirepro-0.8.1/benchmarks/reprobench-results-0.8.0/results/cohomology-wall-smoke-v1.json +137 -0
  35. verirepro-0.8.1/benchmarks/reprobench-results-0.8.0/results/governed-individuation-mechanism-v1.json +132 -0
  36. verirepro-0.8.1/benchmarks/reprobench-results-0.8.0/summary.json +102 -0
  37. verirepro-0.8.1/benchmarks/reprobench-results-0.8.1/manifest.json +44 -0
  38. verirepro-0.8.1/benchmarks/reprobench-results-0.8.1/results/cohomology-wall-smoke-v1.json +137 -0
  39. verirepro-0.8.1/benchmarks/reprobench-results-0.8.1/results/governed-individuation-mechanism-v1.json +132 -0
  40. verirepro-0.8.1/benchmarks/reprobench-results-0.8.1/summary.json +102 -0
  41. verirepro-0.8.1/benchmarks/reprobench-seed/cohomology-wall.json +9 -0
  42. verirepro-0.8.1/benchmarks/reprobench-seed/governed-individuation.json +7 -0
  43. verirepro-0.8.1/benchmarks/reprobench-seed-suite.json +60 -0
  44. verirepro-0.8.1/constraints/certification.txt +50 -0
  45. verirepro-0.8.1/docs/ARCHITECTURE.md +151 -0
  46. verirepro-0.8.1/docs/CANONICAL_IDENTITY.md +20 -0
  47. verirepro-0.8.1/docs/DATASETS.md +152 -0
  48. verirepro-0.8.1/docs/ENVIRONMENT.md +71 -0
  49. verirepro-0.8.1/docs/ENVIRONMENT_MANAGERS.md +61 -0
  50. verirepro-0.8.1/docs/EVIDENCE.md +119 -0
  51. verirepro-0.8.1/docs/GETTING_STARTED.md +99 -0
  52. verirepro-0.8.1/docs/GPU.md +83 -0
  53. verirepro-0.8.1/docs/LITELLM.md +95 -0
  54. verirepro-0.8.1/docs/MODEL_ARTIFACTS.md +80 -0
  55. verirepro-0.8.1/docs/OUTPUTS.md +39 -0
  56. verirepro-0.8.1/docs/PUBLIC_RELEASE_CHECKLIST.md +111 -0
  57. verirepro-0.8.1/docs/PUBLISHING.md +195 -0
  58. verirepro-0.8.1/docs/REAL_PAPER_SMOKE.md +138 -0
  59. verirepro-0.8.1/docs/RELEASE_SIGNING.md +54 -0
  60. verirepro-0.8.1/docs/REPROBENCH.md +259 -0
  61. verirepro-0.8.1/docs/SCHEMAS.md +116 -0
  62. verirepro-0.8.1/docs/TRUST_MODEL.md +242 -0
  63. verirepro-0.8.1/examples/README.md +37 -0
  64. verirepro-0.8.1/examples/artifact-demo/references/figure3.ppm +7 -0
  65. verirepro-0.8.1/examples/artifact-demo/references/table2.csv +2 -0
  66. verirepro-0.8.1/examples/artifact-demo/reproagent.yaml +22 -0
  67. verirepro-0.8.1/examples/artifact-demo/reproduce.py +22 -0
  68. verirepro-0.8.1/examples/artifact-demo/verirepro.yaml +22 -0
  69. verirepro-0.8.1/examples/reproagent.yaml +32 -0
  70. verirepro-0.8.1/examples/verirepro.yaml +41 -0
  71. verirepro-0.8.1/pyproject.toml +98 -0
  72. verirepro-0.8.1/scripts/certification_environment_check.py +167 -0
  73. verirepro-0.8.1/scripts/coverage_gate.py +86 -0
  74. verirepro-0.8.1/scripts/history_scan.py +305 -0
  75. verirepro-0.8.1/scripts/launch_surface_check.py +181 -0
  76. verirepro-0.8.1/scripts/record_release_evidence.py +333 -0
  77. verirepro-0.8.1/scripts/release_check.py +89 -0
  78. verirepro-0.8.1/scripts/release_checks/__init__.py +1 -0
  79. verirepro-0.8.1/scripts/release_checks/action_pin.py +74 -0
  80. verirepro-0.8.1/scripts/release_checks/benchmark_surface.py +544 -0
  81. verirepro-0.8.1/scripts/release_checks/certification_surface.py +40 -0
  82. verirepro-0.8.1/scripts/release_checks/common.py +143 -0
  83. verirepro-0.8.1/scripts/release_checks/package_surface.py +213 -0
  84. verirepro-0.8.1/scripts/release_checks/public_contract_surface.py +141 -0
  85. verirepro-0.8.1/scripts/release_checks/security_surface.py +49 -0
  86. verirepro-0.8.1/scripts/release_checks/workflow_surface.py +240 -0
  87. verirepro-0.8.1/scripts/release_source_check.py +252 -0
  88. verirepro-0.8.1/scripts/run_llm_planning_smoke.py +297 -0
  89. verirepro-0.8.1/scripts/run_real_paper_smoke.py +404 -0
  90. verirepro-0.8.1/scripts/run_reprobench_seed.py +409 -0
  91. verirepro-0.8.1/scripts/stamp_release_measurement.py +131 -0
  92. verirepro-0.8.1/scripts/verify_release_tag.py +177 -0
  93. verirepro-0.8.1/src/reproagent/__init__.py +12 -0
  94. verirepro-0.8.1/src/reproagent/artifacts.py +394 -0
  95. verirepro-0.8.1/src/reproagent/cli.py +355 -0
  96. verirepro-0.8.1/src/reproagent/config.py +388 -0
  97. verirepro-0.8.1/src/reproagent/core.py +31 -0
  98. verirepro-0.8.1/src/reproagent/datasets.py +716 -0
  99. verirepro-0.8.1/src/reproagent/discovery.py +351 -0
  100. verirepro-0.8.1/src/reproagent/environment.py +558 -0
  101. verirepro-0.8.1/src/reproagent/experiment.py +352 -0
  102. verirepro-0.8.1/src/reproagent/intelligence.py +513 -0
  103. verirepro-0.8.1/src/reproagent/llm.py +327 -0
  104. verirepro-0.8.1/src/reproagent/metrics.py +114 -0
  105. verirepro-0.8.1/src/reproagent/model_artifacts.py +152 -0
  106. verirepro-0.8.1/src/reproagent/models.py +159 -0
  107. verirepro-0.8.1/src/reproagent/pipeline.py +547 -0
  108. verirepro-0.8.1/src/reproagent/pipeline_execution.py +121 -0
  109. verirepro-0.8.1/src/reproagent/pipeline_policy.py +160 -0
  110. verirepro-0.8.1/src/reproagent/pipeline_reporting.py +81 -0
  111. verirepro-0.8.1/src/reproagent/pipeline_verification.py +180 -0
  112. verirepro-0.8.1/src/reproagent/release_provenance.py +110 -0
  113. verirepro-0.8.1/src/reproagent/reporting.py +200 -0
  114. verirepro-0.8.1/src/reproagent/repository.py +424 -0
  115. verirepro-0.8.1/src/reproagent/repository_intelligence.py +268 -0
  116. verirepro-0.8.1/src/reproagent/reprobench_adapter.py +505 -0
  117. verirepro-0.8.1/src/reproagent/reprobench_summary.py +438 -0
  118. verirepro-0.8.1/src/reproagent/sources.py +312 -0
  119. verirepro-0.8.1/src/reproagent/usage.py +100 -0
  120. verirepro-0.8.1/src/reproagent/workspaces.py +27 -0
  121. verirepro-0.8.1/src/verirepro/__init__.py +10 -0
  122. verirepro-0.8.1/src/verirepro/__main__.py +6 -0
  123. verirepro-0.8.1/src/verirepro/cli.py +5 -0
  124. verirepro-0.8.1/src/verirepro/py.typed +0 -0
  125. verirepro-0.8.1/src/verirepro/reprobench.py +42 -0
  126. verirepro-0.8.1/tests/test_action_pin.py +93 -0
  127. verirepro-0.8.1/tests/test_artifacts_integrity.py +774 -0
  128. verirepro-0.8.1/tests/test_certification_environment.py +39 -0
  129. verirepro-0.8.1/tests/test_certification_surface.py +88 -0
  130. verirepro-0.8.1/tests/test_cli_dispatch.py +801 -0
  131. verirepro-0.8.1/tests/test_coverage_gate.py +56 -0
  132. verirepro-0.8.1/tests/test_datasets.py +129 -0
  133. verirepro-0.8.1/tests/test_datasets_downloads.py +938 -0
  134. verirepro-0.8.1/tests/test_discovery.py +134 -0
  135. verirepro-0.8.1/tests/test_environment.py +208 -0
  136. verirepro-0.8.1/tests/test_environment_failures.py +699 -0
  137. verirepro-0.8.1/tests/test_experiment.py +31 -0
  138. verirepro-0.8.1/tests/test_failure_matrix.py +139 -0
  139. verirepro-0.8.1/tests/test_gpu_policy_v08.py +114 -0
  140. verirepro-0.8.1/tests/test_history_scan.py +131 -0
  141. verirepro-0.8.1/tests/test_intelligence.py +201 -0
  142. verirepro-0.8.1/tests/test_launch_surface_check.py +158 -0
  143. verirepro-0.8.1/tests/test_llm_client_contract.py +594 -0
  144. verirepro-0.8.1/tests/test_llm_error_redaction.py +35 -0
  145. verirepro-0.8.1/tests/test_manifest_untrusted_input_safety.py +104 -0
  146. verirepro-0.8.1/tests/test_metrics.py +33 -0
  147. verirepro-0.8.1/tests/test_model_artifacts_v08.py +194 -0
  148. verirepro-0.8.1/tests/test_package_support_contract.py +32 -0
  149. verirepro-0.8.1/tests/test_pipeline.py +189 -0
  150. verirepro-0.8.1/tests/test_pipeline_execution.py +148 -0
  151. verirepro-0.8.1/tests/test_pipeline_verification.py +233 -0
  152. verirepro-0.8.1/tests/test_public_ci_contract.py +228 -0
  153. verirepro-0.8.1/tests/test_public_contract_surface.py +85 -0
  154. verirepro-0.8.1/tests/test_public_namespace.py +33 -0
  155. verirepro-0.8.1/tests/test_python_compatibility_workflow_contract.py +49 -0
  156. verirepro-0.8.1/tests/test_release_check_layers.py +301 -0
  157. verirepro-0.8.1/tests/test_release_source_identity.py +264 -0
  158. verirepro-0.8.1/tests/test_release_tag_verification.py +175 -0
  159. verirepro-0.8.1/tests/test_reporting_render.py +438 -0
  160. verirepro-0.8.1/tests/test_repository_security.py +137 -0
  161. verirepro-0.8.1/tests/test_reprobench_entrypoints.py +1178 -0
  162. verirepro-0.8.1/tests/test_reprobench_release_contract.py +94 -0
  163. verirepro-0.8.1/tests/test_runtime_nonroot_v08.py +151 -0
  164. verirepro-0.8.1/tests/test_runtime_readonly_v08.py +117 -0
  165. verirepro-0.8.1/tests/test_source_security.py +104 -0
  166. verirepro-0.8.1/tests/test_sources_acquisition.py +730 -0
  167. verirepro-0.8.1/tests/test_usage_accounting.py +199 -0
  168. 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,5 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Security report
4
+ url: https://github.com/XiantingWu/VeriRepro/security/advisories/new
5
+ about: Do not disclose credentials, sandbox escapes, SSRF, or other security-sensitive findings in a public issue.
@@ -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