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.
- concerto_multirobot-0.7.0/.devcontainer/devcontainer.json +19 -0
- concerto_multirobot-0.7.0/.editorconfig +21 -0
- concerto_multirobot-0.7.0/.gitattributes +31 -0
- concerto_multirobot-0.7.0/.github/CODEOWNERS +31 -0
- concerto_multirobot-0.7.0/.github/ISSUE_TEMPLATE/adr-question.md +25 -0
- concerto_multirobot-0.7.0/.github/ISSUE_TEMPLATE/bug.md +45 -0
- concerto_multirobot-0.7.0/.github/ISSUE_TEMPLATE/feature.md +27 -0
- concerto_multirobot-0.7.0/.github/PULL_REQUEST_TEMPLATE.md +39 -0
- concerto_multirobot-0.7.0/.github/branch-protection.json +38 -0
- concerto_multirobot-0.7.0/.github/dependabot.yml +50 -0
- concerto_multirobot-0.7.0/.github/workflows/ci.yml +215 -0
- concerto_multirobot-0.7.0/.github/workflows/docs-deploy.yml +35 -0
- concerto_multirobot-0.7.0/.github/workflows/release.yml +175 -0
- concerto_multirobot-0.7.0/.github/workflows/security.yml +79 -0
- concerto_multirobot-0.7.0/.gitignore +78 -0
- concerto_multirobot-0.7.0/.gitleaksignore +9 -0
- concerto_multirobot-0.7.0/.pre-commit-config.yaml +66 -0
- concerto_multirobot-0.7.0/.release-please-manifest.json +3 -0
- concerto_multirobot-0.7.0/CHANGELOG.md +190 -0
- concerto_multirobot-0.7.0/CITATION.cff +29 -0
- concerto_multirobot-0.7.0/CODE_OF_CONDUCT.md +132 -0
- concerto_multirobot-0.7.0/CONTRIBUTING.md +146 -0
- concerto_multirobot-0.7.0/Dockerfile.cpu +42 -0
- concerto_multirobot-0.7.0/Dockerfile.gpu +59 -0
- concerto_multirobot-0.7.0/LICENSE +202 -0
- concerto_multirobot-0.7.0/Makefile +131 -0
- concerto_multirobot-0.7.0/NOTICE +53 -0
- concerto_multirobot-0.7.0/PKG-INFO +845 -0
- concerto_multirobot-0.7.0/README.md +580 -0
- concerto_multirobot-0.7.0/SECURITY.md +49 -0
- concerto_multirobot-0.7.0/adr/ADR-001-fork-vs-build.md +65 -0
- concerto_multirobot-0.7.0/adr/ADR-002-rl-framework.md +83 -0
- concerto_multirobot-0.7.0/adr/ADR-003-comm-interface.md +63 -0
- concerto_multirobot-0.7.0/adr/ADR-004-safety-filter.md +128 -0
- concerto_multirobot-0.7.0/adr/ADR-005-simulator-base.md +63 -0
- concerto_multirobot-0.7.0/adr/ADR-006-partner-policy-assumptions.md +58 -0
- concerto_multirobot-0.7.0/adr/ADR-007-heterogeneity-axis-selection.md +127 -0
- concerto_multirobot-0.7.0/adr/ADR-008-hrs-bundle.md +63 -0
- concerto_multirobot-0.7.0/adr/ADR-009-partner-zoo.md +69 -0
- concerto_multirobot-0.7.0/adr/ADR-010-fm-partner.md +63 -0
- concerto_multirobot-0.7.0/adr/ADR-011-baseline-set.md +62 -0
- concerto_multirobot-0.7.0/adr/ADR-012-license.md +50 -0
- concerto_multirobot-0.7.0/adr/ADR-013-real-robot-platform.md +50 -0
- concerto_multirobot-0.7.0/adr/ADR-014-safety-reporting.md +68 -0
- concerto_multirobot-0.7.0/adr/ADR-015-tier-task-scope.md +60 -0
- concerto_multirobot-0.7.0/adr/ADR-016-spike-run-schema.md +91 -0
- concerto_multirobot-0.7.0/adr/ADR-INDEX.md +123 -0
- concerto_multirobot-0.7.0/adr/README.md +25 -0
- concerto_multirobot-0.7.0/adr/_template.md +55 -0
- concerto_multirobot-0.7.0/adr/international_axis_evidence.md +484 -0
- concerto_multirobot-0.7.0/adr/spike_004A_safety_mode.md +294 -0
- concerto_multirobot-0.7.0/assets/.gitkeep +0 -0
- concerto_multirobot-0.7.0/configs/training/ego_aht_happo/mpe_cooperative_push.yaml +55 -0
- concerto_multirobot-0.7.0/configs/training/ego_aht_happo/stage0_smoke.yaml +62 -0
- concerto_multirobot-0.7.0/docs/assets/dark_mode.png +0 -0
- concerto_multirobot-0.7.0/docs/assets/light_mode.png +0 -0
- concerto_multirobot-0.7.0/docs/explanation/_assets/month3-lock-priority-2026-05-17.md +78 -0
- concerto_multirobot-0.7.0/docs/explanation/_assets/why-aht/a97c7993a7fb3e25/a97c7993a7fb3e25.json +2015 -0
- concerto_multirobot-0.7.0/docs/explanation/_assets/why-aht/a97c7993a7fb3e25/a97c7993a7fb3e25.png +0 -0
- concerto_multirobot-0.7.0/docs/explanation/phase0-results.md +197 -0
- concerto_multirobot-0.7.0/docs/explanation/principles.md +42 -0
- concerto_multirobot-0.7.0/docs/explanation/threat-model.md +38 -0
- concerto_multirobot-0.7.0/docs/explanation/why-aht.md +120 -0
- concerto_multirobot-0.7.0/docs/explanation/why-conformal.md +376 -0
- concerto_multirobot-0.7.0/docs/explanation/why-maniskill.md +16 -0
- concerto_multirobot-0.7.0/docs/how-to/add-filter.md +58 -0
- concerto_multirobot-0.7.0/docs/how-to/add-partner.md +77 -0
- concerto_multirobot-0.7.0/docs/how-to/run-on-gpu.md +204 -0
- concerto_multirobot-0.7.0/docs/how-to/run-spike.md +103 -0
- concerto_multirobot-0.7.0/docs/how-to/submit-leaderboard.md +106 -0
- concerto_multirobot-0.7.0/docs/index.md +24 -0
- concerto_multirobot-0.7.0/docs/reference/adrs.md +26 -0
- concerto_multirobot-0.7.0/docs/reference/api.md +77 -0
- concerto_multirobot-0.7.0/docs/reference/evaluation.md +209 -0
- concerto_multirobot-0.7.0/docs/reference/glossary.md +35 -0
- concerto_multirobot-0.7.0/docs/reference/literature.md +301 -0
- concerto_multirobot-0.7.0/docs/reference/refs.bib +702 -0
- concerto_multirobot-0.7.0/docs/reference/standards.md +333 -0
- concerto_multirobot-0.7.0/docs/stylesheets/logo-theme-swap.css +13 -0
- concerto_multirobot-0.7.0/docs/tutorials/hello-spike.md +150 -0
- concerto_multirobot-0.7.0/docs/tutorials/stage0-smoke.md +121 -0
- concerto_multirobot-0.7.0/mkdocs.yml +73 -0
- concerto_multirobot-0.7.0/osv-scanner.toml +40 -0
- concerto_multirobot-0.7.0/pyproject.toml +150 -0
- concerto_multirobot-0.7.0/pyright-config.json +11 -0
- concerto_multirobot-0.7.0/pyrightconfig.json +8 -0
- concerto_multirobot-0.7.0/release-please-config.json +16 -0
- concerto_multirobot-0.7.0/ruff.toml +36 -0
- concerto_multirobot-0.7.0/scripts/check_changelog_completeness.py +263 -0
- concerto_multirobot-0.7.0/scripts/check_coverage_floors.py +240 -0
- concerto_multirobot-0.7.0/scripts/check_dist_metadata.py +246 -0
- concerto_multirobot-0.7.0/scripts/check_licences.py +176 -0
- concerto_multirobot-0.7.0/scripts/check_no_ai_mentions.sh +62 -0
- concerto_multirobot-0.7.0/scripts/harl-fork-patches/README.md +126 -0
- concerto_multirobot-0.7.0/scripts/harl-fork-patches/v0.1.0-aht/COMMIT_MSG.txt +66 -0
- concerto_multirobot-0.7.0/scripts/harl-fork-patches/v0.1.0-aht/harl/algorithms/actors/ego_aht_happo.py +274 -0
- concerto_multirobot-0.7.0/scripts/harl-fork-patches/v0.1.0-aht/harl/envs/concerto_env_adapter.py +102 -0
- concerto_multirobot-0.7.0/scripts/harl-fork-patches/v0.1.0-aht/harl/runners/ego_aht_runner.py +87 -0
- concerto_multirobot-0.7.0/scripts/harl-fork-patches/v0.1.0-aht/tests/test_ego_aht_happo.py +93 -0
- concerto_multirobot-0.7.0/scripts/repro/.gitkeep +0 -0
- concerto_multirobot-0.7.0/scripts/repro/artifacts/happo_seed7_step50k.pt.sha256 +1 -0
- concerto_multirobot-0.7.0/scripts/repro/empirical_guarantee.sh +42 -0
- concerto_multirobot-0.7.0/scripts/repro/stage0_smoke.sh +41 -0
- concerto_multirobot-0.7.0/scripts/repro/stage1_as.sh +112 -0
- concerto_multirobot-0.7.0/scripts/repro/stage1_om.sh +88 -0
- concerto_multirobot-0.7.0/scripts/repro/zoo_seed.sh +127 -0
- concerto_multirobot-0.7.0/spikes/preregistration/.gitkeep +0 -0
- concerto_multirobot-0.7.0/spikes/preregistration/AS.yaml +53 -0
- concerto_multirobot-0.7.0/spikes/preregistration/CM.yaml +50 -0
- concerto_multirobot-0.7.0/spikes/preregistration/CR.yaml +59 -0
- concerto_multirobot-0.7.0/spikes/preregistration/OM.yaml +45 -0
- concerto_multirobot-0.7.0/spikes/preregistration/PF.yaml +63 -0
- concerto_multirobot-0.7.0/spikes/preregistration/SA.yaml +72 -0
- concerto_multirobot-0.7.0/spikes/results/stage1-AS-20260517/leaderboard.json +20 -0
- concerto_multirobot-0.7.0/spikes/results/stage1-AS-20260517/spike_as.json +2821 -0
- concerto_multirobot-0.7.0/spikes/results/stage1-OM-20260517/leaderboard.json +20 -0
- concerto_multirobot-0.7.0/spikes/results/stage1-OM-20260517/spike_om.json +2821 -0
- concerto_multirobot-0.7.0/src/chamber/__init__.py +20 -0
- concerto_multirobot-0.7.0/src/chamber/benchmarks/__init__.py +7 -0
- concerto_multirobot-0.7.0/src/chamber/benchmarks/ego_ppo_trainer.py +1046 -0
- concerto_multirobot-0.7.0/src/chamber/benchmarks/stage0_smoke.py +266 -0
- concerto_multirobot-0.7.0/src/chamber/benchmarks/stage0_smoke_adapter.py +450 -0
- concerto_multirobot-0.7.0/src/chamber/benchmarks/stage1_as.py +391 -0
- concerto_multirobot-0.7.0/src/chamber/benchmarks/stage1_common.py +162 -0
- concerto_multirobot-0.7.0/src/chamber/benchmarks/stage1_om.py +563 -0
- concerto_multirobot-0.7.0/src/chamber/benchmarks/training_runner.py +243 -0
- concerto_multirobot-0.7.0/src/chamber/cli/__init__.py +7 -0
- concerto_multirobot-0.7.0/src/chamber/cli/_spike_list.py +106 -0
- concerto_multirobot-0.7.0/src/chamber/cli/_spike_next_stage.py +257 -0
- concerto_multirobot-0.7.0/src/chamber/cli/_spike_run.py +332 -0
- concerto_multirobot-0.7.0/src/chamber/cli/_spike_summarize_month3.py +788 -0
- concerto_multirobot-0.7.0/src/chamber/cli/_spike_train.py +140 -0
- concerto_multirobot-0.7.0/src/chamber/cli/_spike_verify_prereg.py +319 -0
- concerto_multirobot-0.7.0/src/chamber/cli/eval.py +269 -0
- concerto_multirobot-0.7.0/src/chamber/cli/render_tables.py +117 -0
- concerto_multirobot-0.7.0/src/chamber/cli/spike.py +117 -0
- concerto_multirobot-0.7.0/src/chamber/comm/__init__.py +58 -0
- concerto_multirobot-0.7.0/src/chamber/comm/aoi.py +86 -0
- concerto_multirobot-0.7.0/src/chamber/comm/api.py +132 -0
- concerto_multirobot-0.7.0/src/chamber/comm/degradation.py +314 -0
- concerto_multirobot-0.7.0/src/chamber/comm/errors.py +33 -0
- concerto_multirobot-0.7.0/src/chamber/comm/fixed_format.py +163 -0
- concerto_multirobot-0.7.0/src/chamber/comm/learned_overlay.py +77 -0
- concerto_multirobot-0.7.0/src/chamber/comm/profiles.py +34 -0
- concerto_multirobot-0.7.0/src/chamber/envs/__init__.py +23 -0
- concerto_multirobot-0.7.0/src/chamber/envs/action_repeat.py +85 -0
- concerto_multirobot-0.7.0/src/chamber/envs/comm_shaping.py +84 -0
- concerto_multirobot-0.7.0/src/chamber/envs/errors.py +16 -0
- concerto_multirobot-0.7.0/src/chamber/envs/mpe_cooperative_push.py +310 -0
- concerto_multirobot-0.7.0/src/chamber/envs/partner_meta.py +162 -0
- concerto_multirobot-0.7.0/src/chamber/envs/texture_filter.py +60 -0
- concerto_multirobot-0.7.0/src/chamber/evaluation/__init__.py +81 -0
- concerto_multirobot-0.7.0/src/chamber/evaluation/bootstrap.py +400 -0
- concerto_multirobot-0.7.0/src/chamber/evaluation/hrs.py +120 -0
- concerto_multirobot-0.7.0/src/chamber/evaluation/prereg.py +279 -0
- concerto_multirobot-0.7.0/src/chamber/evaluation/render.py +257 -0
- concerto_multirobot-0.7.0/src/chamber/evaluation/results.py +302 -0
- concerto_multirobot-0.7.0/src/chamber/partners/__init__.py +60 -0
- concerto_multirobot-0.7.0/src/chamber/partners/api.py +150 -0
- concerto_multirobot-0.7.0/src/chamber/partners/frozen_harl.py +449 -0
- concerto_multirobot-0.7.0/src/chamber/partners/frozen_mappo.py +418 -0
- concerto_multirobot-0.7.0/src/chamber/partners/heuristic.py +186 -0
- concerto_multirobot-0.7.0/src/chamber/partners/interface.py +93 -0
- concerto_multirobot-0.7.0/src/chamber/partners/registry.py +103 -0
- concerto_multirobot-0.7.0/src/chamber/partners/selection.py +108 -0
- concerto_multirobot-0.7.0/src/chamber/partners/stubs/__init__.py +8 -0
- concerto_multirobot-0.7.0/src/chamber/partners/stubs/crossformer.py +79 -0
- concerto_multirobot-0.7.0/src/chamber/partners/stubs/openvla.py +80 -0
- concerto_multirobot-0.7.0/src/chamber/tasks/__init__.py +6 -0
- concerto_multirobot-0.7.0/src/chamber/utils/__init__.py +2 -0
- concerto_multirobot-0.7.0/src/chamber/utils/device.py +82 -0
- concerto_multirobot-0.7.0/src/concerto/__init__.py +16 -0
- concerto_multirobot-0.7.0/src/concerto/api/__init__.py +8 -0
- concerto_multirobot-0.7.0/src/concerto/cli.py +18 -0
- concerto_multirobot-0.7.0/src/concerto/policies/__init__.py +6 -0
- concerto_multirobot-0.7.0/src/concerto/safety/__init__.py +153 -0
- concerto_multirobot-0.7.0/src/concerto/safety/api.py +811 -0
- concerto_multirobot-0.7.0/src/concerto/safety/braking.py +268 -0
- concerto_multirobot-0.7.0/src/concerto/safety/budget_split.py +163 -0
- concerto_multirobot-0.7.0/src/concerto/safety/cbf_qp.py +1143 -0
- concerto_multirobot-0.7.0/src/concerto/safety/conformal.py +345 -0
- concerto_multirobot-0.7.0/src/concerto/safety/emergency.py +233 -0
- concerto_multirobot-0.7.0/src/concerto/safety/errors.py +35 -0
- concerto_multirobot-0.7.0/src/concerto/safety/geometry.py +214 -0
- concerto_multirobot-0.7.0/src/concerto/safety/oscbf.py +484 -0
- concerto_multirobot-0.7.0/src/concerto/safety/reporting.py +402 -0
- concerto_multirobot-0.7.0/src/concerto/safety/solvers.py +254 -0
- concerto_multirobot-0.7.0/src/concerto/training/__init__.py +41 -0
- concerto_multirobot-0.7.0/src/concerto/training/checkpoints.py +328 -0
- concerto_multirobot-0.7.0/src/concerto/training/config.py +288 -0
- concerto_multirobot-0.7.0/src/concerto/training/ego_aht.py +490 -0
- concerto_multirobot-0.7.0/src/concerto/training/empirical_guarantee.py +93 -0
- concerto_multirobot-0.7.0/src/concerto/training/learning_signal_check.py +681 -0
- concerto_multirobot-0.7.0/src/concerto/training/logging.py +359 -0
- concerto_multirobot-0.7.0/src/concerto/training/seeding.py +91 -0
- concerto_multirobot-0.7.0/tests/__init__.py +1 -0
- concerto_multirobot-0.7.0/tests/conftest.py +26 -0
- concerto_multirobot-0.7.0/tests/docs/__init__.py +0 -0
- concerto_multirobot-0.7.0/tests/docs/test_readme_quickstart.py +65 -0
- concerto_multirobot-0.7.0/tests/fakes.py +74 -0
- concerto_multirobot-0.7.0/tests/integration/.gitkeep +0 -0
- concerto_multirobot-0.7.0/tests/integration/__init__.py +0 -0
- concerto_multirobot-0.7.0/tests/integration/golden/leaderboard_dup_as.md +4 -0
- concerto_multirobot-0.7.0/tests/integration/golden/leaderboard_min.md +4 -0
- concerto_multirobot-0.7.0/tests/integration/golden/leaderboard_multi_axis.md +4 -0
- concerto_multirobot-0.7.0/tests/integration/test_comm_round_trip.py +174 -0
- concerto_multirobot-0.7.0/tests/integration/test_cpu_determinism.py +135 -0
- concerto_multirobot-0.7.0/tests/integration/test_draft_zoo.py +350 -0
- concerto_multirobot-0.7.0/tests/integration/test_ego_only_filter.py +352 -0
- concerto_multirobot-0.7.0/tests/integration/test_empirical_guarantee.py +99 -0
- concerto_multirobot-0.7.0/tests/integration/test_eval_multi_axis.py +305 -0
- concerto_multirobot-0.7.0/tests/integration/test_evaluation_spine.py +558 -0
- concerto_multirobot-0.7.0/tests/integration/test_partner_swap.py +208 -0
- concerto_multirobot-0.7.0/tests/integration/test_safety_in_loop.py +270 -0
- concerto_multirobot-0.7.0/tests/integration/test_stage0_adapter_fake.py +298 -0
- concerto_multirobot-0.7.0/tests/integration/test_stage0_adapter_real.py +74 -0
- concerto_multirobot-0.7.0/tests/integration/test_stage0_smoke.py +143 -0
- concerto_multirobot-0.7.0/tests/integration/test_stage1_as_fake.py +340 -0
- concerto_multirobot-0.7.0/tests/integration/test_stage1_as_real.py +124 -0
- concerto_multirobot-0.7.0/tests/integration/test_stage1_om_fake.py +406 -0
- concerto_multirobot-0.7.0/tests/integration/test_stage1_om_real.py +93 -0
- concerto_multirobot-0.7.0/tests/integration/test_zoo_seed_partner.py +106 -0
- concerto_multirobot-0.7.0/tests/property/.gitkeep +0 -0
- concerto_multirobot-0.7.0/tests/property/__init__.py +0 -0
- concerto_multirobot-0.7.0/tests/property/test_action_repeat.py +80 -0
- concerto_multirobot-0.7.0/tests/property/test_advantage_decomposition.py +507 -0
- concerto_multirobot-0.7.0/tests/property/test_aoi.py +192 -0
- concerto_multirobot-0.7.0/tests/property/test_bounds_action_norm_inconsistency_documented.py +161 -0
- concerto_multirobot-0.7.0/tests/property/test_braking.py +277 -0
- concerto_multirobot-0.7.0/tests/property/test_braking_multipair.py +225 -0
- concerto_multirobot-0.7.0/tests/property/test_canonical_pair_order.py +337 -0
- concerto_multirobot-0.7.0/tests/property/test_cbf_qp.py +404 -0
- concerto_multirobot-0.7.0/tests/property/test_centralized_heterogeneous.py +207 -0
- concerto_multirobot-0.7.0/tests/property/test_conformal_loss.py +241 -0
- concerto_multirobot-0.7.0/tests/property/test_degradation.py +215 -0
- concerto_multirobot-0.7.0/tests/property/test_fixed_format.py +78 -0
- concerto_multirobot-0.7.0/tests/property/test_no_train_allowed.py +78 -0
- concerto_multirobot-0.7.0/tests/property/test_oscbf.py +388 -0
- concerto_multirobot-0.7.0/tests/property/test_predicted_acceleration_scales_with_dt.py +112 -0
- concerto_multirobot-0.7.0/tests/property/test_qp_saturation.py +89 -0
- concerto_multirobot-0.7.0/tests/property/test_solvers.py +178 -0
- concerto_multirobot-0.7.0/tests/reproduction/__init__.py +8 -0
- concerto_multirobot-0.7.0/tests/reproduction/test_repro_huriot_sibai_table1.py +98 -0
- concerto_multirobot-0.7.0/tests/reproduction/test_zoo_seed_artifact.py +126 -0
- concerto_multirobot-0.7.0/tests/unit/.gitkeep +0 -0
- concerto_multirobot-0.7.0/tests/unit/__init__.py +0 -0
- concerto_multirobot-0.7.0/tests/unit/scripts/test_check_dist_metadata.py +127 -0
- concerto_multirobot-0.7.0/tests/unit/test_action_repeat.py +140 -0
- concerto_multirobot-0.7.0/tests/unit/test_adr_references.py +61 -0
- concerto_multirobot-0.7.0/tests/unit/test_adr_status_taxonomy.py +100 -0
- concerto_multirobot-0.7.0/tests/unit/test_bootstrap.py +86 -0
- concerto_multirobot-0.7.0/tests/unit/test_budget_split.py +103 -0
- concerto_multirobot-0.7.0/tests/unit/test_cbf_qp_ego_only_signs.py +372 -0
- concerto_multirobot-0.7.0/tests/unit/test_check_changelog_completeness.py +222 -0
- concerto_multirobot-0.7.0/tests/unit/test_cli_stubs.py +148 -0
- concerto_multirobot-0.7.0/tests/unit/test_comm_api.py +160 -0
- concerto_multirobot-0.7.0/tests/unit/test_comm_shaping.py +113 -0
- concerto_multirobot-0.7.0/tests/unit/test_conformal.py +159 -0
- concerto_multirobot-0.7.0/tests/unit/test_control_model.py +132 -0
- concerto_multirobot-0.7.0/tests/unit/test_coverage_floors.py +149 -0
- concerto_multirobot-0.7.0/tests/unit/test_docs_examples.py +252 -0
- concerto_multirobot-0.7.0/tests/unit/test_ego_aht_train.py +320 -0
- concerto_multirobot-0.7.0/tests/unit/test_ego_ppo_trainer.py +624 -0
- concerto_multirobot-0.7.0/tests/unit/test_ego_ppo_trainer_rejects_non_frozen_partner.py +224 -0
- concerto_multirobot-0.7.0/tests/unit/test_empirical_guarantee.py +354 -0
- concerto_multirobot-0.7.0/tests/unit/test_fixed_format.py +193 -0
- concerto_multirobot-0.7.0/tests/unit/test_geometry.py +205 -0
- concerto_multirobot-0.7.0/tests/unit/test_harl_fork_patches.py +141 -0
- concerto_multirobot-0.7.0/tests/unit/test_harl_lazy_import.py +277 -0
- concerto_multirobot-0.7.0/tests/unit/test_layout.py +24 -0
- concerto_multirobot-0.7.0/tests/unit/test_learned_overlay.py +77 -0
- concerto_multirobot-0.7.0/tests/unit/test_learning_signal_check.py +187 -0
- concerto_multirobot-0.7.0/tests/unit/test_meta.py +25 -0
- concerto_multirobot-0.7.0/tests/unit/test_mpe_cooperative_push.py +338 -0
- concerto_multirobot-0.7.0/tests/unit/test_next_stage_gate.py +275 -0
- concerto_multirobot-0.7.0/tests/unit/test_no_method_to_benchmark_imports.py +30 -0
- concerto_multirobot-0.7.0/tests/unit/test_no_private_imports.py +34 -0
- concerto_multirobot-0.7.0/tests/unit/test_oscbf_returns_slack.py +246 -0
- concerto_multirobot-0.7.0/tests/unit/test_partner_api.py +180 -0
- concerto_multirobot-0.7.0/tests/unit/test_partner_frozen_harl.py +439 -0
- concerto_multirobot-0.7.0/tests/unit/test_partner_frozen_mappo.py +428 -0
- concerto_multirobot-0.7.0/tests/unit/test_partner_heuristic.py +189 -0
- concerto_multirobot-0.7.0/tests/unit/test_partner_interface.py +97 -0
- concerto_multirobot-0.7.0/tests/unit/test_partner_meta_wrapper.py +157 -0
- concerto_multirobot-0.7.0/tests/unit/test_partner_registry.py +157 -0
- concerto_multirobot-0.7.0/tests/unit/test_partner_selection.py +132 -0
- concerto_multirobot-0.7.0/tests/unit/test_partner_stubs.py +141 -0
- concerto_multirobot-0.7.0/tests/unit/test_prereg_bootstrap_policy.py +108 -0
- concerto_multirobot-0.7.0/tests/unit/test_preregistration_yamls.py +165 -0
- concerto_multirobot-0.7.0/tests/unit/test_reporting.py +357 -0
- concerto_multirobot-0.7.0/tests/unit/test_repro_scripts_parse.py +66 -0
- concerto_multirobot-0.7.0/tests/unit/test_safety_api.py +127 -0
- concerto_multirobot-0.7.0/tests/unit/test_safety_filter_protocol.py +136 -0
- concerto_multirobot-0.7.0/tests/unit/test_seeding.py +69 -0
- concerto_multirobot-0.7.0/tests/unit/test_spike_cli.py +477 -0
- concerto_multirobot-0.7.0/tests/unit/test_spike_run_dry.py +238 -0
- concerto_multirobot-0.7.0/tests/unit/test_spike_run_sub_stage_field.py +128 -0
- concerto_multirobot-0.7.0/tests/unit/test_summarize_month3.py +701 -0
- concerto_multirobot-0.7.0/tests/unit/test_texture_filter.py +76 -0
- concerto_multirobot-0.7.0/tests/unit/test_training_checkpoints.py +319 -0
- concerto_multirobot-0.7.0/tests/unit/test_training_config.py +261 -0
- concerto_multirobot-0.7.0/tests/unit/test_training_logging.py +254 -0
- concerto_multirobot-0.7.0/tests/unit/test_training_runner.py +172 -0
- 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 }}
|