concerto-multirobot 0.7.0__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 (304) hide show
  1. concerto_multirobot-0.7.0/.devcontainer/devcontainer.json +19 -0
  2. concerto_multirobot-0.7.0/.editorconfig +21 -0
  3. concerto_multirobot-0.7.0/.gitattributes +31 -0
  4. concerto_multirobot-0.7.0/.github/CODEOWNERS +31 -0
  5. concerto_multirobot-0.7.0/.github/ISSUE_TEMPLATE/adr-question.md +25 -0
  6. concerto_multirobot-0.7.0/.github/ISSUE_TEMPLATE/bug.md +45 -0
  7. concerto_multirobot-0.7.0/.github/ISSUE_TEMPLATE/feature.md +27 -0
  8. concerto_multirobot-0.7.0/.github/PULL_REQUEST_TEMPLATE.md +39 -0
  9. concerto_multirobot-0.7.0/.github/branch-protection.json +38 -0
  10. concerto_multirobot-0.7.0/.github/dependabot.yml +50 -0
  11. concerto_multirobot-0.7.0/.github/workflows/ci.yml +215 -0
  12. concerto_multirobot-0.7.0/.github/workflows/docs-deploy.yml +35 -0
  13. concerto_multirobot-0.7.0/.github/workflows/release.yml +175 -0
  14. concerto_multirobot-0.7.0/.github/workflows/security.yml +79 -0
  15. concerto_multirobot-0.7.0/.gitignore +78 -0
  16. concerto_multirobot-0.7.0/.gitleaksignore +9 -0
  17. concerto_multirobot-0.7.0/.pre-commit-config.yaml +66 -0
  18. concerto_multirobot-0.7.0/.release-please-manifest.json +3 -0
  19. concerto_multirobot-0.7.0/CHANGELOG.md +190 -0
  20. concerto_multirobot-0.7.0/CITATION.cff +29 -0
  21. concerto_multirobot-0.7.0/CODE_OF_CONDUCT.md +132 -0
  22. concerto_multirobot-0.7.0/CONTRIBUTING.md +146 -0
  23. concerto_multirobot-0.7.0/Dockerfile.cpu +42 -0
  24. concerto_multirobot-0.7.0/Dockerfile.gpu +59 -0
  25. concerto_multirobot-0.7.0/LICENSE +202 -0
  26. concerto_multirobot-0.7.0/Makefile +131 -0
  27. concerto_multirobot-0.7.0/NOTICE +53 -0
  28. concerto_multirobot-0.7.0/PKG-INFO +845 -0
  29. concerto_multirobot-0.7.0/README.md +580 -0
  30. concerto_multirobot-0.7.0/SECURITY.md +49 -0
  31. concerto_multirobot-0.7.0/adr/ADR-001-fork-vs-build.md +65 -0
  32. concerto_multirobot-0.7.0/adr/ADR-002-rl-framework.md +83 -0
  33. concerto_multirobot-0.7.0/adr/ADR-003-comm-interface.md +63 -0
  34. concerto_multirobot-0.7.0/adr/ADR-004-safety-filter.md +128 -0
  35. concerto_multirobot-0.7.0/adr/ADR-005-simulator-base.md +63 -0
  36. concerto_multirobot-0.7.0/adr/ADR-006-partner-policy-assumptions.md +58 -0
  37. concerto_multirobot-0.7.0/adr/ADR-007-heterogeneity-axis-selection.md +127 -0
  38. concerto_multirobot-0.7.0/adr/ADR-008-hrs-bundle.md +63 -0
  39. concerto_multirobot-0.7.0/adr/ADR-009-partner-zoo.md +69 -0
  40. concerto_multirobot-0.7.0/adr/ADR-010-fm-partner.md +63 -0
  41. concerto_multirobot-0.7.0/adr/ADR-011-baseline-set.md +62 -0
  42. concerto_multirobot-0.7.0/adr/ADR-012-license.md +50 -0
  43. concerto_multirobot-0.7.0/adr/ADR-013-real-robot-platform.md +50 -0
  44. concerto_multirobot-0.7.0/adr/ADR-014-safety-reporting.md +68 -0
  45. concerto_multirobot-0.7.0/adr/ADR-015-tier-task-scope.md +60 -0
  46. concerto_multirobot-0.7.0/adr/ADR-016-spike-run-schema.md +91 -0
  47. concerto_multirobot-0.7.0/adr/ADR-INDEX.md +123 -0
  48. concerto_multirobot-0.7.0/adr/README.md +25 -0
  49. concerto_multirobot-0.7.0/adr/_template.md +55 -0
  50. concerto_multirobot-0.7.0/adr/international_axis_evidence.md +484 -0
  51. concerto_multirobot-0.7.0/adr/spike_004A_safety_mode.md +294 -0
  52. concerto_multirobot-0.7.0/assets/.gitkeep +0 -0
  53. concerto_multirobot-0.7.0/configs/training/ego_aht_happo/mpe_cooperative_push.yaml +55 -0
  54. concerto_multirobot-0.7.0/configs/training/ego_aht_happo/stage0_smoke.yaml +62 -0
  55. concerto_multirobot-0.7.0/docs/assets/dark_mode.png +0 -0
  56. concerto_multirobot-0.7.0/docs/assets/light_mode.png +0 -0
  57. concerto_multirobot-0.7.0/docs/explanation/_assets/month3-lock-priority-2026-05-17.md +78 -0
  58. concerto_multirobot-0.7.0/docs/explanation/_assets/why-aht/a97c7993a7fb3e25/a97c7993a7fb3e25.json +2015 -0
  59. concerto_multirobot-0.7.0/docs/explanation/_assets/why-aht/a97c7993a7fb3e25/a97c7993a7fb3e25.png +0 -0
  60. concerto_multirobot-0.7.0/docs/explanation/phase0-results.md +197 -0
  61. concerto_multirobot-0.7.0/docs/explanation/principles.md +42 -0
  62. concerto_multirobot-0.7.0/docs/explanation/threat-model.md +38 -0
  63. concerto_multirobot-0.7.0/docs/explanation/why-aht.md +120 -0
  64. concerto_multirobot-0.7.0/docs/explanation/why-conformal.md +376 -0
  65. concerto_multirobot-0.7.0/docs/explanation/why-maniskill.md +16 -0
  66. concerto_multirobot-0.7.0/docs/how-to/add-filter.md +58 -0
  67. concerto_multirobot-0.7.0/docs/how-to/add-partner.md +77 -0
  68. concerto_multirobot-0.7.0/docs/how-to/run-on-gpu.md +204 -0
  69. concerto_multirobot-0.7.0/docs/how-to/run-spike.md +103 -0
  70. concerto_multirobot-0.7.0/docs/how-to/submit-leaderboard.md +106 -0
  71. concerto_multirobot-0.7.0/docs/index.md +24 -0
  72. concerto_multirobot-0.7.0/docs/reference/adrs.md +26 -0
  73. concerto_multirobot-0.7.0/docs/reference/api.md +77 -0
  74. concerto_multirobot-0.7.0/docs/reference/evaluation.md +209 -0
  75. concerto_multirobot-0.7.0/docs/reference/glossary.md +35 -0
  76. concerto_multirobot-0.7.0/docs/reference/literature.md +301 -0
  77. concerto_multirobot-0.7.0/docs/reference/refs.bib +702 -0
  78. concerto_multirobot-0.7.0/docs/reference/standards.md +333 -0
  79. concerto_multirobot-0.7.0/docs/stylesheets/logo-theme-swap.css +13 -0
  80. concerto_multirobot-0.7.0/docs/tutorials/hello-spike.md +150 -0
  81. concerto_multirobot-0.7.0/docs/tutorials/stage0-smoke.md +121 -0
  82. concerto_multirobot-0.7.0/mkdocs.yml +73 -0
  83. concerto_multirobot-0.7.0/osv-scanner.toml +40 -0
  84. concerto_multirobot-0.7.0/pyproject.toml +150 -0
  85. concerto_multirobot-0.7.0/pyright-config.json +11 -0
  86. concerto_multirobot-0.7.0/pyrightconfig.json +8 -0
  87. concerto_multirobot-0.7.0/release-please-config.json +16 -0
  88. concerto_multirobot-0.7.0/ruff.toml +36 -0
  89. concerto_multirobot-0.7.0/scripts/check_changelog_completeness.py +263 -0
  90. concerto_multirobot-0.7.0/scripts/check_coverage_floors.py +240 -0
  91. concerto_multirobot-0.7.0/scripts/check_dist_metadata.py +246 -0
  92. concerto_multirobot-0.7.0/scripts/check_licences.py +176 -0
  93. concerto_multirobot-0.7.0/scripts/check_no_ai_mentions.sh +62 -0
  94. concerto_multirobot-0.7.0/scripts/harl-fork-patches/README.md +126 -0
  95. concerto_multirobot-0.7.0/scripts/harl-fork-patches/v0.1.0-aht/COMMIT_MSG.txt +66 -0
  96. concerto_multirobot-0.7.0/scripts/harl-fork-patches/v0.1.0-aht/harl/algorithms/actors/ego_aht_happo.py +274 -0
  97. concerto_multirobot-0.7.0/scripts/harl-fork-patches/v0.1.0-aht/harl/envs/concerto_env_adapter.py +102 -0
  98. concerto_multirobot-0.7.0/scripts/harl-fork-patches/v0.1.0-aht/harl/runners/ego_aht_runner.py +87 -0
  99. concerto_multirobot-0.7.0/scripts/harl-fork-patches/v0.1.0-aht/tests/test_ego_aht_happo.py +93 -0
  100. concerto_multirobot-0.7.0/scripts/repro/.gitkeep +0 -0
  101. concerto_multirobot-0.7.0/scripts/repro/artifacts/happo_seed7_step50k.pt.sha256 +1 -0
  102. concerto_multirobot-0.7.0/scripts/repro/empirical_guarantee.sh +42 -0
  103. concerto_multirobot-0.7.0/scripts/repro/stage0_smoke.sh +41 -0
  104. concerto_multirobot-0.7.0/scripts/repro/stage1_as.sh +112 -0
  105. concerto_multirobot-0.7.0/scripts/repro/stage1_om.sh +88 -0
  106. concerto_multirobot-0.7.0/scripts/repro/zoo_seed.sh +127 -0
  107. concerto_multirobot-0.7.0/spikes/preregistration/.gitkeep +0 -0
  108. concerto_multirobot-0.7.0/spikes/preregistration/AS.yaml +53 -0
  109. concerto_multirobot-0.7.0/spikes/preregistration/CM.yaml +50 -0
  110. concerto_multirobot-0.7.0/spikes/preregistration/CR.yaml +59 -0
  111. concerto_multirobot-0.7.0/spikes/preregistration/OM.yaml +45 -0
  112. concerto_multirobot-0.7.0/spikes/preregistration/PF.yaml +63 -0
  113. concerto_multirobot-0.7.0/spikes/preregistration/SA.yaml +72 -0
  114. concerto_multirobot-0.7.0/spikes/results/stage1-AS-20260517/leaderboard.json +20 -0
  115. concerto_multirobot-0.7.0/spikes/results/stage1-AS-20260517/spike_as.json +2821 -0
  116. concerto_multirobot-0.7.0/spikes/results/stage1-OM-20260517/leaderboard.json +20 -0
  117. concerto_multirobot-0.7.0/spikes/results/stage1-OM-20260517/spike_om.json +2821 -0
  118. concerto_multirobot-0.7.0/src/chamber/__init__.py +20 -0
  119. concerto_multirobot-0.7.0/src/chamber/benchmarks/__init__.py +7 -0
  120. concerto_multirobot-0.7.0/src/chamber/benchmarks/ego_ppo_trainer.py +1046 -0
  121. concerto_multirobot-0.7.0/src/chamber/benchmarks/stage0_smoke.py +266 -0
  122. concerto_multirobot-0.7.0/src/chamber/benchmarks/stage0_smoke_adapter.py +450 -0
  123. concerto_multirobot-0.7.0/src/chamber/benchmarks/stage1_as.py +391 -0
  124. concerto_multirobot-0.7.0/src/chamber/benchmarks/stage1_common.py +162 -0
  125. concerto_multirobot-0.7.0/src/chamber/benchmarks/stage1_om.py +563 -0
  126. concerto_multirobot-0.7.0/src/chamber/benchmarks/training_runner.py +243 -0
  127. concerto_multirobot-0.7.0/src/chamber/cli/__init__.py +7 -0
  128. concerto_multirobot-0.7.0/src/chamber/cli/_spike_list.py +106 -0
  129. concerto_multirobot-0.7.0/src/chamber/cli/_spike_next_stage.py +257 -0
  130. concerto_multirobot-0.7.0/src/chamber/cli/_spike_run.py +332 -0
  131. concerto_multirobot-0.7.0/src/chamber/cli/_spike_summarize_month3.py +788 -0
  132. concerto_multirobot-0.7.0/src/chamber/cli/_spike_train.py +140 -0
  133. concerto_multirobot-0.7.0/src/chamber/cli/_spike_verify_prereg.py +319 -0
  134. concerto_multirobot-0.7.0/src/chamber/cli/eval.py +269 -0
  135. concerto_multirobot-0.7.0/src/chamber/cli/render_tables.py +117 -0
  136. concerto_multirobot-0.7.0/src/chamber/cli/spike.py +117 -0
  137. concerto_multirobot-0.7.0/src/chamber/comm/__init__.py +58 -0
  138. concerto_multirobot-0.7.0/src/chamber/comm/aoi.py +86 -0
  139. concerto_multirobot-0.7.0/src/chamber/comm/api.py +132 -0
  140. concerto_multirobot-0.7.0/src/chamber/comm/degradation.py +314 -0
  141. concerto_multirobot-0.7.0/src/chamber/comm/errors.py +33 -0
  142. concerto_multirobot-0.7.0/src/chamber/comm/fixed_format.py +163 -0
  143. concerto_multirobot-0.7.0/src/chamber/comm/learned_overlay.py +77 -0
  144. concerto_multirobot-0.7.0/src/chamber/comm/profiles.py +34 -0
  145. concerto_multirobot-0.7.0/src/chamber/envs/__init__.py +23 -0
  146. concerto_multirobot-0.7.0/src/chamber/envs/action_repeat.py +85 -0
  147. concerto_multirobot-0.7.0/src/chamber/envs/comm_shaping.py +84 -0
  148. concerto_multirobot-0.7.0/src/chamber/envs/errors.py +16 -0
  149. concerto_multirobot-0.7.0/src/chamber/envs/mpe_cooperative_push.py +310 -0
  150. concerto_multirobot-0.7.0/src/chamber/envs/partner_meta.py +162 -0
  151. concerto_multirobot-0.7.0/src/chamber/envs/texture_filter.py +60 -0
  152. concerto_multirobot-0.7.0/src/chamber/evaluation/__init__.py +81 -0
  153. concerto_multirobot-0.7.0/src/chamber/evaluation/bootstrap.py +400 -0
  154. concerto_multirobot-0.7.0/src/chamber/evaluation/hrs.py +120 -0
  155. concerto_multirobot-0.7.0/src/chamber/evaluation/prereg.py +279 -0
  156. concerto_multirobot-0.7.0/src/chamber/evaluation/render.py +257 -0
  157. concerto_multirobot-0.7.0/src/chamber/evaluation/results.py +302 -0
  158. concerto_multirobot-0.7.0/src/chamber/partners/__init__.py +60 -0
  159. concerto_multirobot-0.7.0/src/chamber/partners/api.py +150 -0
  160. concerto_multirobot-0.7.0/src/chamber/partners/frozen_harl.py +449 -0
  161. concerto_multirobot-0.7.0/src/chamber/partners/frozen_mappo.py +418 -0
  162. concerto_multirobot-0.7.0/src/chamber/partners/heuristic.py +186 -0
  163. concerto_multirobot-0.7.0/src/chamber/partners/interface.py +93 -0
  164. concerto_multirobot-0.7.0/src/chamber/partners/registry.py +103 -0
  165. concerto_multirobot-0.7.0/src/chamber/partners/selection.py +108 -0
  166. concerto_multirobot-0.7.0/src/chamber/partners/stubs/__init__.py +8 -0
  167. concerto_multirobot-0.7.0/src/chamber/partners/stubs/crossformer.py +79 -0
  168. concerto_multirobot-0.7.0/src/chamber/partners/stubs/openvla.py +80 -0
  169. concerto_multirobot-0.7.0/src/chamber/tasks/__init__.py +6 -0
  170. concerto_multirobot-0.7.0/src/chamber/utils/__init__.py +2 -0
  171. concerto_multirobot-0.7.0/src/chamber/utils/device.py +82 -0
  172. concerto_multirobot-0.7.0/src/concerto/__init__.py +16 -0
  173. concerto_multirobot-0.7.0/src/concerto/api/__init__.py +8 -0
  174. concerto_multirobot-0.7.0/src/concerto/cli.py +18 -0
  175. concerto_multirobot-0.7.0/src/concerto/policies/__init__.py +6 -0
  176. concerto_multirobot-0.7.0/src/concerto/safety/__init__.py +153 -0
  177. concerto_multirobot-0.7.0/src/concerto/safety/api.py +811 -0
  178. concerto_multirobot-0.7.0/src/concerto/safety/braking.py +268 -0
  179. concerto_multirobot-0.7.0/src/concerto/safety/budget_split.py +163 -0
  180. concerto_multirobot-0.7.0/src/concerto/safety/cbf_qp.py +1143 -0
  181. concerto_multirobot-0.7.0/src/concerto/safety/conformal.py +345 -0
  182. concerto_multirobot-0.7.0/src/concerto/safety/emergency.py +233 -0
  183. concerto_multirobot-0.7.0/src/concerto/safety/errors.py +35 -0
  184. concerto_multirobot-0.7.0/src/concerto/safety/geometry.py +214 -0
  185. concerto_multirobot-0.7.0/src/concerto/safety/oscbf.py +484 -0
  186. concerto_multirobot-0.7.0/src/concerto/safety/reporting.py +402 -0
  187. concerto_multirobot-0.7.0/src/concerto/safety/solvers.py +254 -0
  188. concerto_multirobot-0.7.0/src/concerto/training/__init__.py +41 -0
  189. concerto_multirobot-0.7.0/src/concerto/training/checkpoints.py +328 -0
  190. concerto_multirobot-0.7.0/src/concerto/training/config.py +288 -0
  191. concerto_multirobot-0.7.0/src/concerto/training/ego_aht.py +490 -0
  192. concerto_multirobot-0.7.0/src/concerto/training/empirical_guarantee.py +93 -0
  193. concerto_multirobot-0.7.0/src/concerto/training/learning_signal_check.py +681 -0
  194. concerto_multirobot-0.7.0/src/concerto/training/logging.py +359 -0
  195. concerto_multirobot-0.7.0/src/concerto/training/seeding.py +91 -0
  196. concerto_multirobot-0.7.0/tests/__init__.py +1 -0
  197. concerto_multirobot-0.7.0/tests/conftest.py +26 -0
  198. concerto_multirobot-0.7.0/tests/docs/__init__.py +0 -0
  199. concerto_multirobot-0.7.0/tests/docs/test_readme_quickstart.py +65 -0
  200. concerto_multirobot-0.7.0/tests/fakes.py +74 -0
  201. concerto_multirobot-0.7.0/tests/integration/.gitkeep +0 -0
  202. concerto_multirobot-0.7.0/tests/integration/__init__.py +0 -0
  203. concerto_multirobot-0.7.0/tests/integration/golden/leaderboard_dup_as.md +4 -0
  204. concerto_multirobot-0.7.0/tests/integration/golden/leaderboard_min.md +4 -0
  205. concerto_multirobot-0.7.0/tests/integration/golden/leaderboard_multi_axis.md +4 -0
  206. concerto_multirobot-0.7.0/tests/integration/test_comm_round_trip.py +174 -0
  207. concerto_multirobot-0.7.0/tests/integration/test_cpu_determinism.py +135 -0
  208. concerto_multirobot-0.7.0/tests/integration/test_draft_zoo.py +350 -0
  209. concerto_multirobot-0.7.0/tests/integration/test_ego_only_filter.py +352 -0
  210. concerto_multirobot-0.7.0/tests/integration/test_empirical_guarantee.py +99 -0
  211. concerto_multirobot-0.7.0/tests/integration/test_eval_multi_axis.py +305 -0
  212. concerto_multirobot-0.7.0/tests/integration/test_evaluation_spine.py +558 -0
  213. concerto_multirobot-0.7.0/tests/integration/test_partner_swap.py +208 -0
  214. concerto_multirobot-0.7.0/tests/integration/test_safety_in_loop.py +270 -0
  215. concerto_multirobot-0.7.0/tests/integration/test_stage0_adapter_fake.py +298 -0
  216. concerto_multirobot-0.7.0/tests/integration/test_stage0_adapter_real.py +74 -0
  217. concerto_multirobot-0.7.0/tests/integration/test_stage0_smoke.py +143 -0
  218. concerto_multirobot-0.7.0/tests/integration/test_stage1_as_fake.py +340 -0
  219. concerto_multirobot-0.7.0/tests/integration/test_stage1_as_real.py +124 -0
  220. concerto_multirobot-0.7.0/tests/integration/test_stage1_om_fake.py +406 -0
  221. concerto_multirobot-0.7.0/tests/integration/test_stage1_om_real.py +93 -0
  222. concerto_multirobot-0.7.0/tests/integration/test_zoo_seed_partner.py +106 -0
  223. concerto_multirobot-0.7.0/tests/property/.gitkeep +0 -0
  224. concerto_multirobot-0.7.0/tests/property/__init__.py +0 -0
  225. concerto_multirobot-0.7.0/tests/property/test_action_repeat.py +80 -0
  226. concerto_multirobot-0.7.0/tests/property/test_advantage_decomposition.py +507 -0
  227. concerto_multirobot-0.7.0/tests/property/test_aoi.py +192 -0
  228. concerto_multirobot-0.7.0/tests/property/test_bounds_action_norm_inconsistency_documented.py +161 -0
  229. concerto_multirobot-0.7.0/tests/property/test_braking.py +277 -0
  230. concerto_multirobot-0.7.0/tests/property/test_braking_multipair.py +225 -0
  231. concerto_multirobot-0.7.0/tests/property/test_canonical_pair_order.py +337 -0
  232. concerto_multirobot-0.7.0/tests/property/test_cbf_qp.py +404 -0
  233. concerto_multirobot-0.7.0/tests/property/test_centralized_heterogeneous.py +207 -0
  234. concerto_multirobot-0.7.0/tests/property/test_conformal_loss.py +241 -0
  235. concerto_multirobot-0.7.0/tests/property/test_degradation.py +215 -0
  236. concerto_multirobot-0.7.0/tests/property/test_fixed_format.py +78 -0
  237. concerto_multirobot-0.7.0/tests/property/test_no_train_allowed.py +78 -0
  238. concerto_multirobot-0.7.0/tests/property/test_oscbf.py +388 -0
  239. concerto_multirobot-0.7.0/tests/property/test_predicted_acceleration_scales_with_dt.py +112 -0
  240. concerto_multirobot-0.7.0/tests/property/test_qp_saturation.py +89 -0
  241. concerto_multirobot-0.7.0/tests/property/test_solvers.py +178 -0
  242. concerto_multirobot-0.7.0/tests/reproduction/__init__.py +8 -0
  243. concerto_multirobot-0.7.0/tests/reproduction/test_repro_huriot_sibai_table1.py +98 -0
  244. concerto_multirobot-0.7.0/tests/reproduction/test_zoo_seed_artifact.py +126 -0
  245. concerto_multirobot-0.7.0/tests/unit/.gitkeep +0 -0
  246. concerto_multirobot-0.7.0/tests/unit/__init__.py +0 -0
  247. concerto_multirobot-0.7.0/tests/unit/scripts/test_check_dist_metadata.py +127 -0
  248. concerto_multirobot-0.7.0/tests/unit/test_action_repeat.py +140 -0
  249. concerto_multirobot-0.7.0/tests/unit/test_adr_references.py +61 -0
  250. concerto_multirobot-0.7.0/tests/unit/test_adr_status_taxonomy.py +100 -0
  251. concerto_multirobot-0.7.0/tests/unit/test_bootstrap.py +86 -0
  252. concerto_multirobot-0.7.0/tests/unit/test_budget_split.py +103 -0
  253. concerto_multirobot-0.7.0/tests/unit/test_cbf_qp_ego_only_signs.py +372 -0
  254. concerto_multirobot-0.7.0/tests/unit/test_check_changelog_completeness.py +222 -0
  255. concerto_multirobot-0.7.0/tests/unit/test_cli_stubs.py +148 -0
  256. concerto_multirobot-0.7.0/tests/unit/test_comm_api.py +160 -0
  257. concerto_multirobot-0.7.0/tests/unit/test_comm_shaping.py +113 -0
  258. concerto_multirobot-0.7.0/tests/unit/test_conformal.py +159 -0
  259. concerto_multirobot-0.7.0/tests/unit/test_control_model.py +132 -0
  260. concerto_multirobot-0.7.0/tests/unit/test_coverage_floors.py +149 -0
  261. concerto_multirobot-0.7.0/tests/unit/test_docs_examples.py +252 -0
  262. concerto_multirobot-0.7.0/tests/unit/test_ego_aht_train.py +320 -0
  263. concerto_multirobot-0.7.0/tests/unit/test_ego_ppo_trainer.py +624 -0
  264. concerto_multirobot-0.7.0/tests/unit/test_ego_ppo_trainer_rejects_non_frozen_partner.py +224 -0
  265. concerto_multirobot-0.7.0/tests/unit/test_empirical_guarantee.py +354 -0
  266. concerto_multirobot-0.7.0/tests/unit/test_fixed_format.py +193 -0
  267. concerto_multirobot-0.7.0/tests/unit/test_geometry.py +205 -0
  268. concerto_multirobot-0.7.0/tests/unit/test_harl_fork_patches.py +141 -0
  269. concerto_multirobot-0.7.0/tests/unit/test_harl_lazy_import.py +277 -0
  270. concerto_multirobot-0.7.0/tests/unit/test_layout.py +24 -0
  271. concerto_multirobot-0.7.0/tests/unit/test_learned_overlay.py +77 -0
  272. concerto_multirobot-0.7.0/tests/unit/test_learning_signal_check.py +187 -0
  273. concerto_multirobot-0.7.0/tests/unit/test_meta.py +25 -0
  274. concerto_multirobot-0.7.0/tests/unit/test_mpe_cooperative_push.py +338 -0
  275. concerto_multirobot-0.7.0/tests/unit/test_next_stage_gate.py +275 -0
  276. concerto_multirobot-0.7.0/tests/unit/test_no_method_to_benchmark_imports.py +30 -0
  277. concerto_multirobot-0.7.0/tests/unit/test_no_private_imports.py +34 -0
  278. concerto_multirobot-0.7.0/tests/unit/test_oscbf_returns_slack.py +246 -0
  279. concerto_multirobot-0.7.0/tests/unit/test_partner_api.py +180 -0
  280. concerto_multirobot-0.7.0/tests/unit/test_partner_frozen_harl.py +439 -0
  281. concerto_multirobot-0.7.0/tests/unit/test_partner_frozen_mappo.py +428 -0
  282. concerto_multirobot-0.7.0/tests/unit/test_partner_heuristic.py +189 -0
  283. concerto_multirobot-0.7.0/tests/unit/test_partner_interface.py +97 -0
  284. concerto_multirobot-0.7.0/tests/unit/test_partner_meta_wrapper.py +157 -0
  285. concerto_multirobot-0.7.0/tests/unit/test_partner_registry.py +157 -0
  286. concerto_multirobot-0.7.0/tests/unit/test_partner_selection.py +132 -0
  287. concerto_multirobot-0.7.0/tests/unit/test_partner_stubs.py +141 -0
  288. concerto_multirobot-0.7.0/tests/unit/test_prereg_bootstrap_policy.py +108 -0
  289. concerto_multirobot-0.7.0/tests/unit/test_preregistration_yamls.py +165 -0
  290. concerto_multirobot-0.7.0/tests/unit/test_reporting.py +357 -0
  291. concerto_multirobot-0.7.0/tests/unit/test_repro_scripts_parse.py +66 -0
  292. concerto_multirobot-0.7.0/tests/unit/test_safety_api.py +127 -0
  293. concerto_multirobot-0.7.0/tests/unit/test_safety_filter_protocol.py +136 -0
  294. concerto_multirobot-0.7.0/tests/unit/test_seeding.py +69 -0
  295. concerto_multirobot-0.7.0/tests/unit/test_spike_cli.py +477 -0
  296. concerto_multirobot-0.7.0/tests/unit/test_spike_run_dry.py +238 -0
  297. concerto_multirobot-0.7.0/tests/unit/test_spike_run_sub_stage_field.py +128 -0
  298. concerto_multirobot-0.7.0/tests/unit/test_summarize_month3.py +701 -0
  299. concerto_multirobot-0.7.0/tests/unit/test_texture_filter.py +76 -0
  300. concerto_multirobot-0.7.0/tests/unit/test_training_checkpoints.py +319 -0
  301. concerto_multirobot-0.7.0/tests/unit/test_training_config.py +261 -0
  302. concerto_multirobot-0.7.0/tests/unit/test_training_logging.py +254 -0
  303. concerto_multirobot-0.7.0/tests/unit/test_training_runner.py +172 -0
  304. concerto_multirobot-0.7.0/uv.lock +3510 -0
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "concerto",
3
+ "build": { "dockerfile": "../Dockerfile.cpu", "target": "dev" },
4
+ "features": {
5
+ "ghcr.io/devcontainers/features/git:1": {},
6
+ "ghcr.io/devcontainers/features/github-cli:1": {}
7
+ },
8
+ "postCreateCommand": "uv sync --all-extras && pre-commit install",
9
+ "customizations": {
10
+ "vscode": {
11
+ "extensions": [
12
+ "ms-python.python",
13
+ "charliermarsh.ruff",
14
+ "ms-python.vscode-pylance",
15
+ "tamasfe.even-better-toml"
16
+ ]
17
+ }
18
+ }
19
+ }
@@ -0,0 +1,21 @@
1
+ root = true
2
+
3
+ [*]
4
+ charset = utf-8
5
+ end_of_line = lf
6
+ insert_final_newline = true
7
+ trim_trailing_whitespace = true
8
+
9
+ [*.py]
10
+ indent_style = space
11
+ indent_size = 4
12
+
13
+ [*.{toml,yaml,yml,json}]
14
+ indent_style = space
15
+ indent_size = 2
16
+
17
+ [*.md]
18
+ trim_trailing_whitespace = false
19
+
20
+ [Makefile]
21
+ indent_style = tab
@@ -0,0 +1,31 @@
1
+ # Normalise line endings to LF on checkout everywhere.
2
+ * text=auto eol=lf
3
+
4
+ # Source files — always text.
5
+ *.py text eol=lf
6
+ *.toml text eol=lf
7
+ *.yaml text eol=lf
8
+ *.yml text eol=lf
9
+ *.json text eol=lf
10
+ *.md text eol=lf
11
+ *.rst text eol=lf
12
+ *.sh text eol=lf
13
+ *.cfg text eol=lf
14
+ *.ini text eol=lf
15
+ *.txt text eol=lf
16
+ *.lock text eol=lf
17
+
18
+ # Binary assets — do not diff or mangle.
19
+ *.png binary
20
+ *.jpg binary
21
+ *.jpeg binary
22
+ *.gif binary
23
+ *.ico binary
24
+ *.pdf binary
25
+ *.pt binary
26
+ *.pth binary
27
+ *.ckpt binary
28
+ *.safetensors binary
29
+
30
+ # Linguist overrides — keep language stats accurate.
31
+ uv.lock linguist-generated=true
@@ -0,0 +1,31 @@
1
+ # CODEOWNERS for CONCERTO/CHAMBER
2
+ #
3
+ # Global default — every PR needs at least one of these reviewers.
4
+ * @fsafaei
5
+
6
+ # Method (CONCERTO) — ADR-bearing, extra care.
7
+ /src/concerto/api/ @fsafaei
8
+ /src/concerto/safety/ @fsafaei
9
+ /src/concerto/training/ @fsafaei
10
+ /src/concerto/policies/ @fsafaei
11
+
12
+ # Benchmark (CHAMBER) — ADR-bearing, extra care.
13
+ /src/chamber/envs/ @fsafaei
14
+ /src/chamber/comm/ @fsafaei
15
+ /src/chamber/partners/ @fsafaei
16
+ /src/chamber/safety/ @fsafaei
17
+ /src/chamber/evaluation/ @fsafaei
18
+ /src/chamber/benchmarks/ @fsafaei
19
+
20
+ # ADR snapshot — frozen artefact, sync only via dedicated PR.
21
+ /adr/ @fsafaei
22
+
23
+ # CI / supply-chain.
24
+ /.github/ @fsafaei
25
+ /scripts/ @fsafaei
26
+ /Makefile @fsafaei
27
+ /pyproject.toml @fsafaei
28
+ /uv.lock @fsafaei
29
+
30
+ # Spike infrastructure — pre-registration discipline lives here.
31
+ /spikes/ @fsafaei
@@ -0,0 +1,25 @@
1
+ ---
2
+ name: ADR question
3
+ about: Ask a question about an existing or proposed ADR
4
+ title: "adr-question: "
5
+ labels: ["adr"]
6
+ ---
7
+
8
+ ## Which ADR
9
+
10
+ <!-- ADR number and section reference. Example: ADR-004 §Decision. -->
11
+
12
+ ## Question
13
+
14
+ <!-- The specific thing you'd like clarified or challenged. -->
15
+
16
+ ## Context
17
+
18
+ <!-- Background that helps reviewers understand why you're asking.
19
+ If your question is downstream of a spike outcome, name the
20
+ spike and the relevant leaderboard.json. -->
21
+
22
+ ## Suggested resolution (optional)
23
+
24
+ <!-- If you have a concrete proposal, write it here. ADR amendments
25
+ are tracked through this issue type. -->
@@ -0,0 +1,45 @@
1
+ ---
2
+ name: Bug report
3
+ about: Something is not working as expected
4
+ title: "bug: "
5
+ labels: ["bug"]
6
+ ---
7
+
8
+ ## What happened?
9
+
10
+ <!-- A clear description of the unexpected behaviour. -->
11
+
12
+ ## What did you expect to happen?
13
+
14
+ <!-- The behaviour you expected. -->
15
+
16
+ ## Steps to reproduce
17
+
18
+ 1.
19
+ 2.
20
+ 3.
21
+
22
+ ## Minimal reproducer
23
+
24
+ <!-- A code snippet or command line that reproduces the bug. The smaller the better. -->
25
+
26
+ ```python
27
+ ```
28
+
29
+ ## Environment
30
+
31
+ - OS:
32
+ - Python version:
33
+ - `concerto` / `chamber` version (or commit SHA):
34
+ - GPU / CUDA (if relevant):
35
+ - ManiSkill v3 commit (if relevant):
36
+
37
+ ## Logs / stack trace
38
+
39
+ ```
40
+ ```
41
+
42
+ ## ADR-relevant?
43
+
44
+ <!-- Does this bug call into question an accepted ADR's Decision? If yes,
45
+ name the ADR and section. -->
@@ -0,0 +1,27 @@
1
+ ---
2
+ name: Feature request
3
+ about: Suggest a new feature or enhancement
4
+ title: "feat: "
5
+ labels: ["enhancement"]
6
+ ---
7
+
8
+ ## Problem
9
+
10
+ <!-- What user problem does this solve? Who hits it, and how often? -->
11
+
12
+ ## Proposed solution
13
+
14
+ <!-- How would you like the project to address it? -->
15
+
16
+ ## Alternatives considered
17
+
18
+ <!-- Other approaches you thought about and why they're worse. -->
19
+
20
+ ## ADR implications
21
+
22
+ <!-- Does this require a new ADR? Does it change an accepted one?
23
+ If unsure, leave a placeholder and we'll discuss. -->
24
+
25
+ ## Phase / milestone
26
+
27
+ <!-- Which Phase (0/1/2/3) does this belong in? Which milestone? -->
@@ -0,0 +1,39 @@
1
+ ## Summary
2
+
3
+ <!-- One paragraph: what changed and why. -->
4
+
5
+ ## ADR references
6
+
7
+ <!-- Cite the ADR(s) this PR implements or touches.
8
+ Example: ADR-001 §Decision item 2; ADR-007 Stage 1 AS spike. -->
9
+
10
+ -
11
+
12
+ ## Test plan
13
+
14
+ <!-- How was this validated? Reference new tests by path. -->
15
+
16
+ - [ ] Unit tests added/updated
17
+ - [ ] Property tests (Hypothesis) added/updated where applicable
18
+ - [ ] Integration tests added/updated
19
+ - [ ] `make verify` green locally
20
+ - [ ] `make verify-no-ai-mentions` green locally
21
+
22
+ ## Risk
23
+
24
+ <!-- Known risks, edge cases, or rollback plan. Cross-reference any open
25
+ risks in the milestone's plan/*.md §Risk register if applicable. -->
26
+
27
+ ## Reproducibility note
28
+
29
+ <!-- If this PR produces a results artefact (a spike, a benchmark output,
30
+ a published number), name the `scripts/repro/<artefact>.sh` that
31
+ reproduces it from a clean checkout. -->
32
+
33
+ ## Checklist
34
+
35
+ - [ ] Conventional Commits format on every commit message
36
+ - [ ] Every public symbol has a docstring with an ADR reference (where ADR-bearing)
37
+ - [ ] No `from chamber` imports inside `src/concerto/`
38
+ - [ ] No private (`_`) imports from `mani_skill`
39
+ - [ ] Documentation updated in the same PR (Diátaxis quadrant)
@@ -0,0 +1,38 @@
1
+ {
2
+ "_note": "Apply to the 'main' branch via: gh api repos/fsafaei/concerto/branches/main/protection --method PUT --input .github/branch-protection.json",
3
+ "required_status_checks": {
4
+ "strict": true,
5
+ "contexts": [
6
+ "lint (3.11)",
7
+ "lint (3.12)",
8
+ "type-check (3.11)",
9
+ "type-check (3.12)",
10
+ "test-unit (3.11)",
11
+ "test-unit (3.12)",
12
+ "test-property (3.11)",
13
+ "test-property (3.12)",
14
+ "test-integration (3.11)",
15
+ "test-integration (3.12)",
16
+ "coverage-gate",
17
+ "docs-build",
18
+ "licence-scan",
19
+ "sbom",
20
+ "CodeQL",
21
+ "OSV-Scanner",
22
+ "verify-no-ai-mentions"
23
+ ]
24
+ },
25
+ "enforce_admins": true,
26
+ "required_pull_request_reviews": {
27
+ "required_approving_review_count": 1,
28
+ "dismiss_stale_reviews": true,
29
+ "require_code_owner_reviews": true,
30
+ "require_last_push_approval": true
31
+ },
32
+ "restrictions": null,
33
+ "required_linear_history": true,
34
+ "allow_force_pushes": false,
35
+ "allow_deletions": false,
36
+ "required_conversation_resolution": true,
37
+ "required_signatures": true
38
+ }
@@ -0,0 +1,50 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "github-actions"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "daily"
7
+ groups:
8
+ ci:
9
+ patterns: ["*"]
10
+ labels:
11
+ - "dependencies"
12
+ - "ci"
13
+
14
+ - package-ecosystem: "pip"
15
+ directory: "/"
16
+ schedule:
17
+ interval: "weekly"
18
+ day: "monday"
19
+ groups:
20
+ runtime-minor-patch:
21
+ update-types:
22
+ - "minor"
23
+ - "patch"
24
+ open-pull-requests-limit: 5
25
+ labels:
26
+ - "dependencies"
27
+ - "python"
28
+ ignore:
29
+ # ADR-001 §Decision: ManiSkill v3 is pinned at 3.0.1 by SHA. The
30
+ # wrapper-only extension contract requires this exact version
31
+ # (private-API drift between minor releases would break our
32
+ # wrappers silently). Bumping requires a new ADR + a full
33
+ # wrapper sweep, not a dependabot PR.
34
+ - dependency-name: "mani-skill"
35
+ # ADR-002 §Decisions + plan/05 §2: the ``torch>=2.3,<2.6`` range
36
+ # is the validated compatibility window for both
37
+ # ``mani-skill==3.0.1`` and the ``harl@v0.1.0-aht`` fork. Bumping
38
+ # outside that range would break compat; bumping inside it (e.g.
39
+ # 2.5.0 → 2.5.1) requires a manual sweep of the test suite.
40
+ # Either way the upgrade decision is a CONCERTO-side audit, not
41
+ # a dependabot PR.
42
+ - dependency-name: "torch"
43
+
44
+ - package-ecosystem: "docker"
45
+ directory: "/"
46
+ schedule:
47
+ interval: "weekly"
48
+ labels:
49
+ - "dependencies"
50
+ - "docker"
@@ -0,0 +1,215 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ paths:
7
+ - "src/**"
8
+ - "tests/**"
9
+ - ".github/workflows/ci.yml"
10
+ - "pyproject.toml"
11
+ - "README.md"
12
+ - "docs/**"
13
+ - "mkdocs.yml"
14
+ pull_request:
15
+ branches: [main]
16
+ paths:
17
+ - "src/**"
18
+ - "tests/**"
19
+ - ".github/workflows/ci.yml"
20
+ - "pyproject.toml"
21
+ - "README.md"
22
+ - "docs/**"
23
+ - "mkdocs.yml"
24
+ # Catch release-please PRs (which only touch CHANGELOG + pyproject) for
25
+ # the verify-changelog-completeness job below — closes #126.
26
+ - "CHANGELOG.md"
27
+ - "scripts/check_changelog_completeness.py"
28
+
29
+ permissions:
30
+ contents: read
31
+
32
+ jobs:
33
+ lint:
34
+ name: lint (${{ matrix.python-version }})
35
+ runs-on: ubuntu-latest
36
+ strategy:
37
+ matrix:
38
+ python-version: ["3.11", "3.12"]
39
+ steps:
40
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
41
+ - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v5.4.1
42
+ with:
43
+ python-version: ${{ matrix.python-version }}
44
+ - run: uv sync --group dev --group train
45
+ - run: uv run ruff check src tests
46
+ - run: uv run ruff format --check src tests
47
+
48
+ type-check:
49
+ name: type-check (${{ matrix.python-version }})
50
+ runs-on: ubuntu-latest
51
+ strategy:
52
+ matrix:
53
+ python-version: ["3.11", "3.12"]
54
+ steps:
55
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
56
+ - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v5.4.1
57
+ with:
58
+ python-version: ${{ matrix.python-version }}
59
+ - run: uv sync --group dev --group train
60
+ - run: uv run pyright
61
+
62
+ test-unit:
63
+ name: test-unit (${{ matrix.python-version }})
64
+ runs-on: ubuntu-latest
65
+ strategy:
66
+ matrix:
67
+ python-version: ["3.11", "3.12"]
68
+ steps:
69
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
70
+ - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v5.4.1
71
+ with:
72
+ python-version: ${{ matrix.python-version }}
73
+ - run: uv sync --group dev --group train
74
+ - run: uv run pytest tests/unit -n auto --no-cov
75
+
76
+ test-property:
77
+ name: test-property (${{ matrix.python-version }})
78
+ runs-on: ubuntu-latest
79
+ strategy:
80
+ matrix:
81
+ python-version: ["3.11", "3.12"]
82
+ steps:
83
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
84
+ - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v5.4.1
85
+ with:
86
+ python-version: ${{ matrix.python-version }}
87
+ - run: uv sync --group dev --group train
88
+ - run: uv run pytest tests/property --no-cov
89
+
90
+ test-integration:
91
+ name: test-integration (${{ matrix.python-version }})
92
+ runs-on: ubuntu-latest
93
+ strategy:
94
+ matrix:
95
+ python-version: ["3.11", "3.12"]
96
+ steps:
97
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
98
+ with:
99
+ # ADR-007 §Discipline: Stage-1 adapters (and the real-env
100
+ # tests at tests/integration/test_stage1_{as,om}_real.py)
101
+ # call chamber.evaluation.prereg.verify_git_tag, which
102
+ # `git rev-parse`s pre-registration tags (e.g.
103
+ # prereg-stage1-AS-2026-05-15). Default checkout ships
104
+ # without tags, so without this the audit-chain pin would
105
+ # red-x CI as a tag-missing PreregistrationError. Fetching
106
+ # tags is cheap and matches the existing pattern below for
107
+ # verify-changelog-completeness.
108
+ fetch-tags: true
109
+ - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v5.4.1
110
+ with:
111
+ python-version: ${{ matrix.python-version }}
112
+ - run: uv sync --group dev --group train
113
+ - run: uv run pytest tests/integration -n auto -m "not gpu" --no-cov
114
+
115
+ coverage-gate:
116
+ name: coverage-gate
117
+ runs-on: ubuntu-latest
118
+ needs: [test-unit, test-property, test-integration]
119
+ steps:
120
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
121
+ with:
122
+ # ADR-007 §Discipline: same rationale as test-integration —
123
+ # the unfiltered pytest collects tests/integration/test_stage1_*_real.py
124
+ # which call verify_git_tag, so the prereg tags MUST be
125
+ # present on the runner.
126
+ fetch-tags: true
127
+ - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v5.4.1
128
+ with:
129
+ python-version: "3.11"
130
+ - run: uv sync --group dev --group train
131
+ - run: uv run pytest --cov=concerto --cov=chamber --cov-fail-under=80 --cov-report=xml
132
+ - uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
133
+ with:
134
+ files: coverage.xml
135
+ fail_ci_if_error: false
136
+
137
+ docs-build:
138
+ name: docs-build
139
+ runs-on: ubuntu-latest
140
+ steps:
141
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
142
+ - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v5.4.1
143
+ with:
144
+ python-version: "3.11"
145
+ - run: uv sync --extra docs --group dev --group train
146
+ - run: uv run mkdocs build --strict
147
+
148
+ licence-scan:
149
+ name: licence-scan
150
+ runs-on: ubuntu-latest
151
+ steps:
152
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
153
+ - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v5.4.1
154
+ with:
155
+ python-version: "3.11"
156
+ - run: uv sync --group dev --group train
157
+ - run: uv run pip-licenses --format=json --with-license-file --with-notice-file --output-file=licences.json
158
+ - run: uv run python scripts/check_licences.py < licences.json
159
+
160
+ sbom:
161
+ name: sbom
162
+ runs-on: ubuntu-latest
163
+ steps:
164
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
165
+ - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v5.4.1
166
+ with:
167
+ python-version: "3.11"
168
+ - run: uv sync --group dev --group train
169
+ - run: uv run cyclonedx-py environment -o sbom.spdx.json
170
+ - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
171
+ with:
172
+ name: sbom
173
+ path: sbom.spdx.json
174
+
175
+ test-smoke:
176
+ name: test-smoke (${{ matrix.python-version }})
177
+ runs-on: ubuntu-latest
178
+ strategy:
179
+ matrix:
180
+ python-version: ["3.11", "3.12"]
181
+ steps:
182
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
183
+ - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v5.4.1
184
+ with:
185
+ python-version: ${{ matrix.python-version }}
186
+ - run: uv sync --group dev --group train
187
+ # GPU-less runners: Tier-1 (fake env) tests run; Tier-2 (real ManiSkill) tests skip.
188
+ - run: uv run pytest -m smoke --no-cov
189
+
190
+ verify-no-ai-mentions:
191
+ name: verify-no-ai-mentions
192
+ runs-on: ubuntu-latest
193
+ steps:
194
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
195
+ with:
196
+ fetch-depth: 0
197
+ - run: bash scripts/check_no_ai_mentions.sh
198
+
199
+ verify-changelog-completeness:
200
+ # Closes #126. Runs on every PR but is a no-op unless the PR's CHANGELOG
201
+ # adds a new ## [X.Y.Z] section (i.e. the release-please PR). Needs full
202
+ # history + tags so the previous release tag is reachable.
203
+ name: verify-changelog-completeness
204
+ runs-on: ubuntu-latest
205
+ steps:
206
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
207
+ with:
208
+ fetch-depth: 0
209
+ - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v5.4.1
210
+ with:
211
+ python-version: "3.11"
212
+ # The script only uses Python stdlib (subprocess, re, pathlib), so a
213
+ # full `uv sync` is not needed. `uv run --no-project` runs an ephemeral
214
+ # interpreter without resolving the project env — fast and self-contained.
215
+ - run: uv run --no-project python scripts/check_changelog_completeness.py
@@ -0,0 +1,35 @@
1
+ name: Docs Deploy
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ workflow_dispatch:
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ deploy:
13
+ runs-on: ubuntu-latest
14
+ permissions:
15
+ contents: write
16
+ steps:
17
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
18
+ with:
19
+ fetch-depth: 0
20
+ - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v5.4.1
21
+ with:
22
+ python-version: "3.11"
23
+ - run: uv sync --extra docs --group dev
24
+ - run: git config user.name "Farhad Safaei"
25
+ - run: git config user.email "cooperative.physical.ai@gmail.com"
26
+ # Deploy the build to gh-pages under the "dev" version and alias it as "latest".
27
+ # mike will create the gh-pages branch on first run if it does not exist.
28
+ - run: uv run mike deploy --push --update-aliases dev latest
29
+ env:
30
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
31
+ # Ensure the gh-pages root redirects to /latest/ so visiting
32
+ # https://fsafaei.github.io/concerto/ renders the site instead of 404.
33
+ - run: uv run mike set-default --push latest
34
+ env:
35
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}