mayhem-cli 0.6.2__tar.gz → 0.9.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 (448) hide show
  1. mayhem_cli-0.9.0/.coverage +0 -0
  2. mayhem_cli-0.9.0/.github/workflows/ci.yml +146 -0
  3. mayhem_cli-0.9.0/.github/workflows/conformance.yml +34 -0
  4. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/.github/workflows/release.yml +4 -4
  5. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/CHANGELOG.md +250 -0
  6. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/Justfile +56 -42
  7. mayhem_cli-0.9.0/PKG-INFO +479 -0
  8. mayhem_cli-0.9.0/README.md +464 -0
  9. mayhem_cli-0.9.0/docs/README.md +74 -0
  10. mayhem_cli-0.9.0/docs/adr/adr-m7-1-k8s-executor.md +98 -0
  11. mayhem_cli-0.9.0/docs/adr-adr-m7-1-k8s-executor-flip.md +172 -0
  12. mayhem_cli-0.9.0/docs/architecture/fault-taxonomy.md +5 -0
  13. mayhem_cli-0.9.0/docs/architecture/safety.md +12 -0
  14. mayhem_cli-0.9.0/docs/architecture/toolkit.md +5 -0
  15. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/docs/compensation.md +6 -2
  16. mayhem_cli-0.9.0/docs/config.md +314 -0
  17. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/docs/drill-spec.md +245 -30
  18. mayhem_cli-0.9.0/docs/fault-catalog/README.md +21 -0
  19. mayhem_cli-0.9.0/docs/fault-catalog/reliability-matrix.md +64 -0
  20. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/docs/grounding-log.md +5 -0
  21. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/docs/grounding-rules.md +10 -3
  22. mayhem_cli-0.9.0/docs/k8s-new.md +5 -0
  23. mayhem_cli-0.9.0/docs/k8s-plan-1.md +437 -0
  24. mayhem_cli-0.9.0/docs/k8s-plan-2.md +387 -0
  25. mayhem_cli-0.9.0/docs/m7-k8s-executor-discovery.md +164 -0
  26. mayhem_cli-0.9.0/docs/new-plan/00-product-and-cli-roadmap.md +84 -0
  27. mayhem_cli-0.9.0/docs/new-plan/01-workflow-command-architecture.md +84 -0
  28. mayhem_cli-0.9.0/docs/new-plan/02-guided-onboarding-and-target-profiles.md +75 -0
  29. mayhem_cli-0.9.0/docs/new-plan/03-plan-first-execution-and-unified-evidence.md +77 -0
  30. mayhem_cli-0.9.0/docs/new-plan/04-output-errors-and-script-compatibility.md +77 -0
  31. mayhem_cli-0.9.0/docs/new-plan/05-configuration-policy-and-environment-safety.md +73 -0
  32. mayhem_cli-0.9.0/docs/new-plan/06-docker-podman-reliability-slice.md +75 -0
  33. mayhem_cli-0.9.0/docs/new-plan/07-first-class-kubernetes-engine.md +78 -0
  34. mayhem_cli-0.9.0/docs/new-plan/08-fault-catalog-reliability-matrix.md +83 -0
  35. mayhem_cli-0.9.0/docs/new-plan/09-campaigns-coverage-and-explore-loop.md +79 -0
  36. mayhem_cli-0.9.0/docs/new-plan/10-diagnostics-recovery-and-reporting.md +76 -0
  37. mayhem_cli-0.9.0/docs/new-plan/11-extension-api-and-packaging.md +88 -0
  38. mayhem_cli-0.9.0/docs/new-plan/README.md +52 -0
  39. mayhem_cli-0.9.0/docs/observability.md +44 -0
  40. mayhem_cli-0.9.0/docs/policy-and-break-glass.md +31 -0
  41. mayhem_cli-0.9.0/docs/product/cli-product-direction.md +64 -0
  42. mayhem_cli-0.9.0/docs/product/command-architecture.md +100 -0
  43. mayhem_cli-0.9.0/docs/provider-sdk.md +253 -0
  44. mayhem_cli-0.9.0/docs/reference/cli.md +289 -0
  45. mayhem_cli-0.9.0/docs/reference/experiment-dsl.md +10 -0
  46. mayhem_cli-0.9.0/docs/reference/fault-catalog.md +92 -0
  47. mayhem_cli-0.9.0/docs/reference/output-schema.md +76 -0
  48. mayhem_cli-0.9.0/docs/reference/sqlite-schema.md +15 -0
  49. mayhem_cli-0.9.0/docs/superpowers/plans/2026-09-24-container-kubernetes-fault-expansion-plan.md +267 -0
  50. mayhem_cli-0.9.0/docs/superpowers/plans/2026-09-24-documentation-to-implementation-plan.md +406 -0
  51. mayhem_cli-0.9.0/docs/superpowers/specs/2026-09-24-container-kubernetes-fault-expansion-design.md +61 -0
  52. mayhem_cli-0.9.0/docs/superpowers/specs/2026-09-24-documentation-to-implementation-design.md +91 -0
  53. mayhem_cli-0.9.0/docs/v0.9.0/01-vision-and-positioning.md +64 -0
  54. mayhem_cli-0.9.0/docs/v0.9.0/02-feature-brainstorm.md +173 -0
  55. mayhem_cli-0.9.0/docs/v0.9.0/03-gaps-and-standards.md +106 -0
  56. mayhem_cli-0.9.0/docs/v0.9.0/04-architecture-and-decisions.md +115 -0
  57. mayhem_cli-0.9.0/docs/v0.9.0/05-release-roadmap.md +140 -0
  58. mayhem_cli-0.9.0/docs/v0.9.0/06-core-implementation-plan.md +276 -0
  59. mayhem_cli-0.9.0/docs/v0.9.0/07-expansion-implementation-plan.md +274 -0
  60. mayhem_cli-0.9.0/docs/v0.9.0/08-release-readiness.md +98 -0
  61. mayhem_cli-0.9.0/docs/v0.9.0/09-decision-log.md +65 -0
  62. mayhem_cli-0.9.0/docs/v0.9.0/10-repository-evidence.md +97 -0
  63. mayhem_cli-0.9.0/docs/v0.9.0/README.md +38 -0
  64. mayhem_cli-0.9.0/examples/k8s/README.md +39 -0
  65. mayhem_cli-0.9.0/examples/k8s/mayhem.yaml +207 -0
  66. mayhem_cli-0.9.0/examples/providers/test-catalog.json +40 -0
  67. mayhem_cli-0.9.0/examples/providers/test_provider.py +19 -0
  68. mayhem_cli-0.9.0/examples/testCase/mayhem-safe-docker-podman.yaml +50 -0
  69. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/pyproject.toml +56 -9
  70. mayhem_cli-0.9.0/scripts/verify_release_artifacts.py +91 -0
  71. mayhem_cli-0.9.0/src/mayhem/__main__.py +8 -0
  72. mayhem_cli-0.9.0/src/mayhem/agents/executors.py +3931 -0
  73. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/agents/impact.py +37 -1
  74. mayhem_cli-0.9.0/src/mayhem/agents/k8s_control.py +411 -0
  75. mayhem_cli-0.9.0/src/mayhem/agents/k8s_resolve.py +947 -0
  76. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/agents/lease_client.py +7 -0
  77. mayhem_cli-0.9.0/src/mayhem/cli/app.py +286 -0
  78. mayhem_cli-0.9.0/src/mayhem/cli/campaign.py +907 -0
  79. mayhem_cli-0.9.0/src/mayhem/cli/command_registry.py +87 -0
  80. mayhem_cli-0.9.0/src/mayhem/cli/commands.py +48 -0
  81. mayhem_cli-0.9.0/src/mayhem/cli/config_cmd.py +71 -0
  82. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/cli/context.py +3 -0
  83. mayhem_cli-0.9.0/src/mayhem/cli/coverage_cmd.py +262 -0
  84. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/cli/dependency.py +32 -1
  85. mayhem_cli-0.9.0/src/mayhem/cli/doctor.py +88 -0
  86. mayhem_cli-0.9.0/src/mayhem/cli/errors.py +212 -0
  87. mayhem_cli-0.9.0/src/mayhem/cli/execution.py +143 -0
  88. mayhem_cli-0.9.0/src/mayhem/cli/experiment.py +122 -0
  89. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/cli/expert.py +85 -5
  90. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/cli/explore.py +86 -27
  91. mayhem_cli-0.9.0/src/mayhem/cli/extend.py +153 -0
  92. mayhem_cli-0.9.0/src/mayhem/cli/game_day.py +330 -0
  93. mayhem_cli-0.9.0/src/mayhem/cli/init.py +138 -0
  94. mayhem_cli-0.9.0/src/mayhem/cli/inspect.py +526 -0
  95. mayhem_cli-0.9.0/src/mayhem/cli/lifecycle.py +2241 -0
  96. mayhem_cli-0.9.0/src/mayhem/cli/next_cmd.py +271 -0
  97. mayhem_cli-0.9.0/src/mayhem/cli/output.py +149 -0
  98. mayhem_cli-0.9.0/src/mayhem/cli/render.py +166 -0
  99. mayhem_cli-0.9.0/src/mayhem/cli/renderers.py +193 -0
  100. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/cli/resolver.py +10 -0
  101. mayhem_cli-0.9.0/src/mayhem/cli/services.py +808 -0
  102. mayhem_cli-0.9.0/src/mayhem/cli/toolkit.py +227 -0
  103. mayhem_cli-0.9.0/src/mayhem/cli/topology.py +329 -0
  104. mayhem_cli-0.9.0/src/mayhem/cli/verify_bundle.py +70 -0
  105. mayhem_cli-0.9.0/src/mayhem/cli/workflows.py +110 -0
  106. mayhem_cli-0.9.0/src/mayhem/config.py +584 -0
  107. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/controller/cell_runner.py +42 -5
  108. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/controller/compensation.py +180 -7
  109. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/controller/executor.py +897 -11
  110. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/controller/explore_flow.py +40 -17
  111. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/controller/janitor.py +49 -0
  112. mayhem_cli-0.9.0/src/mayhem/controller/k8s_runtime.py +859 -0
  113. mayhem_cli-0.9.0/src/mayhem/controller/plan_diff.py +79 -0
  114. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/controller/planner.py +560 -59
  115. mayhem_cli-0.9.0/src/mayhem/controller/preflight.py +422 -0
  116. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/controller/recovery.py +210 -0
  117. mayhem_cli-0.9.0/src/mayhem/controller/safety.py +576 -0
  118. mayhem_cli-0.9.0/src/mayhem/controller/target_selector.py +3 -0
  119. mayhem_cli-0.9.0/src/mayhem/domain/admission.py +89 -0
  120. mayhem_cli-0.9.0/src/mayhem/domain/campaign_checkpoint.py +217 -0
  121. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/domain/campaigns.py +46 -0
  122. mayhem_cli-0.9.0/src/mayhem/domain/capability_status.py +117 -0
  123. mayhem_cli-0.9.0/src/mayhem/domain/catalog.py +1851 -0
  124. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/domain/common.py +12 -7
  125. mayhem_cli-0.9.0/src/mayhem/domain/coverage.py +314 -0
  126. mayhem_cli-0.9.0/src/mayhem/domain/coverage_graph.py +260 -0
  127. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/domain/decisions.py +33 -0
  128. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/domain/errors.py +28 -0
  129. mayhem_cli-0.9.0/src/mayhem/domain/evidence.py +84 -0
  130. mayhem_cli-0.9.0/src/mayhem/domain/evidence_bundle.py +309 -0
  131. mayhem_cli-0.9.0/src/mayhem/domain/execution_intent.py +332 -0
  132. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/domain/experiments.py +181 -12
  133. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/domain/faults.py +91 -9
  134. mayhem_cli-0.9.0/src/mayhem/domain/game_day.py +219 -0
  135. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/domain/identity.py +15 -0
  136. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/domain/k8s_adapter.py +62 -6
  137. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/domain/leases.py +50 -1
  138. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/domain/m5_campaign.py +73 -3
  139. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/domain/maniac.py +52 -1
  140. mayhem_cli-0.9.0/src/mayhem/domain/observations.py +230 -0
  141. mayhem_cli-0.9.0/src/mayhem/domain/policy.py +140 -0
  142. mayhem_cli-0.9.0/src/mayhem/domain/preflight.py +133 -0
  143. mayhem_cli-0.9.0/src/mayhem/domain/provider.py +323 -0
  144. mayhem_cli-0.9.0/src/mayhem/domain/redaction.py +85 -0
  145. mayhem_cli-0.9.0/src/mayhem/domain/replay.py +74 -0
  146. mayhem_cli-0.9.0/src/mayhem/domain/residual_impact.py +175 -0
  147. mayhem_cli-0.9.0/src/mayhem/domain/resolution.py +72 -0
  148. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/domain/runtime_adapter.py +117 -0
  149. mayhem_cli-0.9.0/src/mayhem/domain/runtime_context.py +102 -0
  150. mayhem_cli-0.9.0/src/mayhem/domain/scenarios.py +345 -0
  151. mayhem_cli-0.9.0/src/mayhem/domain/target.py +125 -0
  152. mayhem_cli-0.9.0/src/mayhem/domain/target_profiles.py +254 -0
  153. mayhem_cli-0.9.0/src/mayhem/domain/target_selector.py +283 -0
  154. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/domain/topology.py +8 -0
  155. mayhem_cli-0.9.0/src/mayhem/infra/campaign_checkpoint_repository.py +75 -0
  156. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/infra/campaign_engine.py +77 -0
  157. mayhem_cli-0.9.0/src/mayhem/infra/catalog_report.py +387 -0
  158. mayhem_cli-0.9.0/src/mayhem/infra/coverage_repository.py +563 -0
  159. mayhem_cli-0.9.0/src/mayhem/infra/diagnostics.py +1162 -0
  160. mayhem_cli-0.9.0/src/mayhem/infra/evidence.py +296 -0
  161. mayhem_cli-0.9.0/src/mayhem/infra/game_day_repository.py +62 -0
  162. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/infra/lease_repository.py +34 -2
  163. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/infra/migrations.py +125 -0
  164. mayhem_cli-0.9.0/src/mayhem/infra/project_detection.py +115 -0
  165. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/infra/ranking.py +44 -2
  166. mayhem_cli-0.9.0/src/mayhem/infra/replay_repository.py +88 -0
  167. mayhem_cli-0.9.0/src/mayhem/infra/report.py +549 -0
  168. mayhem_cli-0.9.0/src/mayhem/observability/__init__.py +20 -0
  169. mayhem_cli-0.9.0/src/mayhem/observability/base.py +56 -0
  170. mayhem_cli-0.9.0/src/mayhem/observability/loki.py +95 -0
  171. mayhem_cli-0.9.0/src/mayhem/observability/otel.py +72 -0
  172. mayhem_cli-0.9.0/src/mayhem/observability/prometheus.py +129 -0
  173. mayhem_cli-0.9.0/src/mayhem/providers/__init__.py +19 -0
  174. mayhem_cli-0.9.0/src/mayhem/providers/builtin.py +131 -0
  175. mayhem_cli-0.9.0/src/mayhem/providers/loader.py +396 -0
  176. mayhem_cli-0.9.0/src/mayhem/providers/observation.py +234 -0
  177. mayhem_cli-0.9.0/src/mayhem/providers/pack.py +195 -0
  178. mayhem_cli-0.9.0/src/mayhem/providers/permissions.py +122 -0
  179. mayhem_cli-0.9.0/src/mayhem/providers/protocols.py +36 -0
  180. mayhem_cli-0.9.0/src/mayhem/providers/registry.py +80 -0
  181. mayhem_cli-0.9.0/src/mayhem/schemas/output_v1.json +43 -0
  182. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/toolkit/tool_runner.py +7 -3
  183. mayhem_cli-0.9.0/src/mayhem/topology/providers/adapter_registry.py +86 -0
  184. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/topology/providers/docker_adapter.py +17 -0
  185. mayhem_cli-0.9.0/src/mayhem/topology/providers/k8s_manifest.py +229 -0
  186. mayhem_cli-0.9.0/src/mayhem/topology/providers/kubernetes.py +416 -0
  187. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/conftest.py +37 -0
  188. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/e2e/test_cli_e2e.py +112 -78
  189. mayhem_cli-0.9.0/tests/fixtures/cli/commands_show.json +37 -0
  190. mayhem_cli-0.9.0/tests/fixtures/cli/coverage.json +22 -0
  191. mayhem_cli-0.9.0/tests/fixtures/cli/doctor.json +18 -0
  192. mayhem_cli-0.9.0/tests/integration/test_artifact_secret_sweep.py +117 -0
  193. mayhem_cli-0.9.0/tests/integration/test_bundle_verifier.py +181 -0
  194. mayhem_cli-0.9.0/tests/integration/test_campaign_resume.py +210 -0
  195. mayhem_cli-0.9.0/tests/integration/test_coverage_delta.py +101 -0
  196. mayhem_cli-0.9.0/tests/integration/test_evidence_degradation.py +52 -0
  197. mayhem_cli-0.9.0/tests/integration/test_game_day_approval_flow.py +224 -0
  198. mayhem_cli-0.9.0/tests/integration/test_observability_run.py +100 -0
  199. mayhem_cli-0.9.0/tests/integration/test_recovery_proof.py +177 -0
  200. mayhem_cli-0.9.0/tests/integration/test_replay_roundtrip.py +26 -0
  201. mayhem_cli-0.9.0/tests/integration/test_scenario_plan_replay.py +133 -0
  202. mayhem_cli-0.9.0/tests/integration/test_slo_success_criteria.py +173 -0
  203. mayhem_cli-0.9.0/tests/package/test_wheel_smoke.py +78 -0
  204. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_accept_criteria.py +5 -1
  205. mayhem_cli-0.9.0/tests/unit/test_action_outcome_contract.py +39 -0
  206. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_additive_schema.py +5 -0
  207. mayhem_cli-0.9.0/tests/unit/test_campaign_checkpoint.py +365 -0
  208. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_campaigns.py +91 -4
  209. mayhem_cli-0.9.0/tests/unit/test_capability_dashboard.py +145 -0
  210. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_capability_safety.py +17 -0
  211. mayhem_cli-0.9.0/tests/unit/test_capability_truth.py +89 -0
  212. mayhem_cli-0.9.0/tests/unit/test_ci_workflow_contract.py +44 -0
  213. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_cli.py +231 -9
  214. mayhem_cli-0.9.0/tests/unit/test_cli_active_surface.py +62 -0
  215. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_cli_campaign.py +20 -0
  216. mayhem_cli-0.9.0/tests/unit/test_cli_config.py +44 -0
  217. mayhem_cli-0.9.0/tests/unit/test_cli_contract.py +114 -0
  218. mayhem_cli-0.9.0/tests/unit/test_cli_doctor.py +145 -0
  219. mayhem_cli-0.9.0/tests/unit/test_cli_errors.py +132 -0
  220. mayhem_cli-0.9.0/tests/unit/test_cli_execution.py +222 -0
  221. mayhem_cli-0.9.0/tests/unit/test_cli_execution_intent.py +1154 -0
  222. mayhem_cli-0.9.0/tests/unit/test_cli_exhaustive_matrix.py +767 -0
  223. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_cli_exit_codes.py +13 -11
  224. mayhem_cli-0.9.0/tests/unit/test_cli_extend.py +149 -0
  225. mayhem_cli-0.9.0/tests/unit/test_cli_init.py +123 -0
  226. mayhem_cli-0.9.0/tests/unit/test_cli_output.py +75 -0
  227. mayhem_cli-0.9.0/tests/unit/test_cli_renderers.py +124 -0
  228. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_cli_resolver.py +7 -7
  229. mayhem_cli-0.9.0/tests/unit/test_cli_topology.py +139 -0
  230. mayhem_cli-0.9.0/tests/unit/test_cli_user_regressions.py +59 -0
  231. mayhem_cli-0.9.0/tests/unit/test_command_inventory.py +58 -0
  232. mayhem_cli-0.9.0/tests/unit/test_command_registry.py +33 -0
  233. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_config.py +58 -0
  234. mayhem_cli-0.9.0/tests/unit/test_config_target_profiles.py +496 -0
  235. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_container_fault_matrix.py +15 -8
  236. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_coverage.py +82 -7
  237. mayhem_cli-0.9.0/tests/unit/test_coverage_graph.py +372 -0
  238. mayhem_cli-0.9.0/tests/unit/test_diagnostics.py +330 -0
  239. mayhem_cli-0.9.0/tests/unit/test_diagnostics_target_profiles.py +360 -0
  240. mayhem_cli-0.9.0/tests/unit/test_documentation_consistency.py +58 -0
  241. mayhem_cli-0.9.0/tests/unit/test_evidence_bundle.py +208 -0
  242. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_example_specs_yaml.py +5 -3
  243. mayhem_cli-0.9.0/tests/unit/test_execution_intent.py +328 -0
  244. mayhem_cli-0.9.0/tests/unit/test_executor_admission.py +164 -0
  245. mayhem_cli-0.9.0/tests/unit/test_expansion_checkpoint.py +335 -0
  246. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_fault_catalog_all.py +56 -8
  247. mayhem_cli-0.9.0/tests/unit/test_fault_catalog_exhaustive.py +946 -0
  248. mayhem_cli-0.9.0/tests/unit/test_fault_catalog_metadata.py +126 -0
  249. mayhem_cli-0.9.0/tests/unit/test_fault_expansion_catalog.py +91 -0
  250. mayhem_cli-0.9.0/tests/unit/test_fault_expansion_container.py +161 -0
  251. mayhem_cli-0.9.0/tests/unit/test_fault_expansion_kubernetes.py +183 -0
  252. mayhem_cli-0.9.0/tests/unit/test_fault_pack_validation.py +230 -0
  253. mayhem_cli-0.9.0/tests/unit/test_game_day.py +179 -0
  254. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_impact_gate.py +1 -0
  255. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_janitor.py +12 -0
  256. mayhem_cli-0.9.0/tests/unit/test_k8s_cli.py +156 -0
  257. mayhem_cli-0.9.0/tests/unit/test_k8s_discovery.py +370 -0
  258. mayhem_cli-0.9.0/tests/unit/test_k8s_manifest.py +512 -0
  259. mayhem_cli-0.9.0/tests/unit/test_k8s_plan1.py +285 -0
  260. mayhem_cli-0.9.0/tests/unit/test_k8s_plan2.py +210 -0
  261. mayhem_cli-0.9.0/tests/unit/test_k8s_selection.py +155 -0
  262. mayhem_cli-0.9.0/tests/unit/test_kplan1_targets.py +453 -0
  263. mayhem_cli-0.9.0/tests/unit/test_kplan2_topology.py +89 -0
  264. mayhem_cli-0.9.0/tests/unit/test_kplan3_resolver.py +203 -0
  265. mayhem_cli-0.9.0/tests/unit/test_kplan3_runtime.py +644 -0
  266. mayhem_cli-0.9.0/tests/unit/test_kplan5_runtime.py +508 -0
  267. mayhem_cli-0.9.0/tests/unit/test_kplan6_runtime.py +1205 -0
  268. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_lifecycle_run_liveness.py +66 -0
  269. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_m7_k8s.py +50 -6
  270. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_maniac.py +1 -0
  271. mayhem_cli-0.9.0/tests/unit/test_observability_connectors.py +275 -0
  272. mayhem_cli-0.9.0/tests/unit/test_observation_contract.py +281 -0
  273. mayhem_cli-0.9.0/tests/unit/test_plan_diff.py +55 -0
  274. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_planner.py +24 -0
  275. mayhem_cli-0.9.0/tests/unit/test_policy_explain.py +243 -0
  276. mayhem_cli-0.9.0/tests/unit/test_preflight.py +154 -0
  277. mayhem_cli-0.9.0/tests/unit/test_provider_loader.py +222 -0
  278. mayhem_cli-0.9.0/tests/unit/test_provider_permissions.py +126 -0
  279. mayhem_cli-0.9.0/tests/unit/test_provider_registry.py +136 -0
  280. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_ranking.py +34 -3
  281. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_recovery.py +104 -0
  282. mayhem_cli-0.9.0/tests/unit/test_redaction_boundary.py +77 -0
  283. mayhem_cli-0.9.0/tests/unit/test_release_contract.py +556 -0
  284. mayhem_cli-0.9.0/tests/unit/test_replay_capsule.py +54 -0
  285. mayhem_cli-0.9.0/tests/unit/test_replay_cli.py +165 -0
  286. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_report.py +133 -1
  287. mayhem_cli-0.9.0/tests/unit/test_residual_impact.py +275 -0
  288. mayhem_cli-0.9.0/tests/unit/test_runtime_context.py +1286 -0
  289. mayhem_cli-0.9.0/tests/unit/test_runtime_execution_matrix.py +2311 -0
  290. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_safety.py +18 -4
  291. mayhem_cli-0.9.0/tests/unit/test_scenario_compiler.py +260 -0
  292. mayhem_cli-0.9.0/tests/unit/test_selection_modes.py +352 -0
  293. mayhem_cli-0.9.0/tests/unit/test_target_profiles.py +141 -0
  294. mayhem_cli-0.9.0/tests/unit/test_target_profiles_config.py +287 -0
  295. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_topology_providers.py +6 -1
  296. mayhem_cli-0.9.0/tests/unit/test_v090_docs_contract.py +140 -0
  297. mayhem_cli-0.9.0/tests/unit/test_v090_edge_cases.py +587 -0
  298. mayhem_cli-0.9.0/tests/unit/test_workflow_groups.py +47 -0
  299. mayhem_cli-0.9.0/uv.lock +1638 -0
  300. mayhem_cli-0.6.2/PKG-INFO +0 -555
  301. mayhem_cli-0.6.2/README.md +0 -541
  302. mayhem_cli-0.6.2/docs/config.md +0 -285
  303. mayhem_cli-0.6.2/docs/features.md +0 -408
  304. mayhem_cli-0.6.2/docs/re-design.md +0 -1405
  305. mayhem_cli-0.6.2/examples/k8s/README.md +0 -32
  306. mayhem_cli-0.6.2/examples/k8s/mayhem.yaml +0 -76
  307. mayhem_cli-0.6.2/src/mayhem/agents/executors.py +0 -430
  308. mayhem_cli-0.6.2/src/mayhem/cli/app.py +0 -175
  309. mayhem_cli-0.6.2/src/mayhem/cli/campaign.py +0 -496
  310. mayhem_cli-0.6.2/src/mayhem/cli/config_cmd.py +0 -47
  311. mayhem_cli-0.6.2/src/mayhem/cli/coverage_cmd.py +0 -325
  312. mayhem_cli-0.6.2/src/mayhem/cli/experiment.py +0 -24
  313. mayhem_cli-0.6.2/src/mayhem/cli/lifecycle.py +0 -885
  314. mayhem_cli-0.6.2/src/mayhem/cli/next_cmd.py +0 -216
  315. mayhem_cli-0.6.2/src/mayhem/cli/services.py +0 -459
  316. mayhem_cli-0.6.2/src/mayhem/cli/toolkit.py +0 -41
  317. mayhem_cli-0.6.2/src/mayhem/cli/topology.py +0 -127
  318. mayhem_cli-0.6.2/src/mayhem/config.py +0 -266
  319. mayhem_cli-0.6.2/src/mayhem/controller/safety.py +0 -392
  320. mayhem_cli-0.6.2/src/mayhem/domain/catalog.py +0 -727
  321. mayhem_cli-0.6.2/src/mayhem/domain/coverage.py +0 -204
  322. mayhem_cli-0.6.2/src/mayhem/infra/coverage_repository.py +0 -271
  323. mayhem_cli-0.6.2/src/mayhem/infra/report.py +0 -227
  324. mayhem_cli-0.6.2/src/mayhem/topology/providers/adapter_registry.py +0 -60
  325. mayhem_cli-0.6.2/tests/unit/test_cli_contract.py +0 -113
  326. mayhem_cli-0.6.2/tests/unit/test_command_inventory.py +0 -117
  327. mayhem_cli-0.6.2/uv.lock +0 -819
  328. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/.gitignore +0 -0
  329. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/cliff.toml +0 -0
  330. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/examples/k8s/kubernetes.yaml +0 -0
  331. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/examples/testCase/data/hello.txt +0 -0
  332. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/examples/testCase/data/index.html +0 -0
  333. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/examples/testCase/docker-compose.mayhem.yml +0 -0
  334. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/examples/testCase/docker-compose.yml +0 -0
  335. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/examples/testCase/mayhem.yaml +0 -0
  336. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/examples/testCase/nginx.conf +0 -0
  337. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/agent/__init__.py +0 -0
  338. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/agent/cli.py +0 -0
  339. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/agents/__init__.py +0 -0
  340. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/agents/capabilities.py +0 -0
  341. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/agents/probes.py +0 -0
  342. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/agents/protocol.py +0 -0
  343. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/agents/server.py +0 -0
  344. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/agents/sinks.py +0 -0
  345. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/agents/transports.py +0 -0
  346. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/agents/watchdog.py +0 -0
  347. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/cli/__init__.py +0 -0
  348. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/cli/exit_codes.py +0 -0
  349. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/cli/style.py +0 -0
  350. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/controller/__init__.py +0 -0
  351. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/controller/observability_collector.py +0 -0
  352. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/controller/observations.py +0 -0
  353. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/controller/resilience_report.py +0 -0
  354. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/controller/resource_manager.py +0 -0
  355. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/domain/__init__.py +0 -0
  356. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/domain/cancellation.py +0 -0
  357. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/domain/candidates.py +0 -0
  358. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/domain/capabilities.py +0 -0
  359. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/domain/cell_rules.py +0 -0
  360. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/domain/checks.py +0 -0
  361. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/domain/events.py +0 -0
  362. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/domain/execution_context.py +0 -0
  363. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/domain/execution_loci.py +0 -0
  364. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/domain/load_strategy.py +0 -0
  365. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/domain/observability.py +0 -0
  366. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/domain/outcomes.py +0 -0
  367. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/domain/remote_agent_interface.py +0 -0
  368. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/domain/resources.py +0 -0
  369. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/domain/risks.py +0 -0
  370. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/domain/run_outcome.py +0 -0
  371. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/domain/success.py +0 -0
  372. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/infra/__init__.py +0 -0
  373. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/infra/candidate_gates.py +0 -0
  374. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/infra/candidate_generator.py +0 -0
  375. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/infra/kpi.py +0 -0
  376. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/infra/maniac.py +0 -0
  377. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/infra/migrator.py +0 -0
  378. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/infra/store.py +0 -0
  379. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/py.typed +0 -0
  380. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/spec.py +0 -0
  381. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/toolkit/__init__.py +0 -0
  382. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/toolkit/fingerprint.py +0 -0
  383. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/toolkit/hashing.py +0 -0
  384. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/toolkit/manifests/docker.yaml +0 -0
  385. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/toolkit/manifests/podman.yaml +0 -0
  386. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/toolkit/manifests/stress-ng.yaml +0 -0
  387. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/toolkit/manifests/tc-netem.yaml +0 -0
  388. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/toolkit/manifests/toxiproxy.yaml +0 -0
  389. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/toolkit/registry.py +0 -0
  390. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/topology/__init__.py +0 -0
  391. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/topology/providers/__init__.py +0 -0
  392. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/topology/providers/base.py +0 -0
  393. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/topology/providers/compose.py +0 -0
  394. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/topology/providers/docker_runtime.py +0 -0
  395. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/topology/providers/podman_adapter.py +0 -0
  396. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/topology/resolve.py +0 -0
  397. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/src/mayhem/topology/service.py +0 -0
  398. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/e2e/__init__.py +0 -0
  399. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/integration/test_agent_serve.py +0 -0
  400. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/integration/test_agent_watchdog_e2e.py +0 -0
  401. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/integration/test_m5_e2e.py +0 -0
  402. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/integration/test_store.py +0 -0
  403. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_agent_capabilities.py +0 -0
  404. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_agent_protocol.py +0 -0
  405. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_agents.py +0 -0
  406. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_campaign_run.py +0 -0
  407. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_cancellation.py +0 -0
  408. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_candidates.py +0 -0
  409. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_capability_matrix.py +0 -0
  410. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_capability_registry.py +0 -0
  411. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_cell_rules.py +0 -0
  412. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_cell_runner.py +0 -0
  413. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_check_spec.py +0 -0
  414. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_compensation.py +0 -0
  415. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_coverage_repository.py +0 -0
  416. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_domain_properties.py +0 -0
  417. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_drill_spec.py +0 -0
  418. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_execution_context.py +0 -0
  419. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_executor.py +0 -0
  420. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_executor_drill.py +0 -0
  421. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_faults.py +0 -0
  422. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_fingerprint.py +0 -0
  423. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_fork_atomicity.py +0 -0
  424. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_kpi.py +0 -0
  425. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_lease_repository.py +0 -0
  426. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_leases.py +0 -0
  427. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_load_strategy.py +0 -0
  428. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_m12_step1_catalog.py +0 -0
  429. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_m8_operations.py +0 -0
  430. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_m9_catalog.py +0 -0
  431. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_migrations.py +0 -0
  432. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_network_path_model.py +0 -0
  433. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_observability.py +0 -0
  434. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_observations.py +0 -0
  435. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_resilience_report.py +0 -0
  436. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_resolve.py +0 -0
  437. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_resource_conflict_exec.py +0 -0
  438. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_resource_manager.py +0 -0
  439. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_resources.py +0 -0
  440. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_risks.py +0 -0
  441. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_run_outcome.py +0 -0
  442. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_runtime_adapter.py +0 -0
  443. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_success.py +0 -0
  444. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_three_locus.py +0 -0
  445. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_tool_runner.py +0 -0
  446. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_topology.py +0 -0
  447. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_topology_ctr.py +0 -0
  448. {mayhem_cli-0.6.2 → mayhem_cli-0.9.0}/tests/unit/test_watchdog.py +0 -0
Binary file
@@ -0,0 +1,146 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [v0.9.0, main, master]
6
+ pull_request:
7
+ workflow_dispatch:
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ concurrency:
13
+ group: ci-${{ github.workflow }}-${{ github.ref }}
14
+ cancel-in-progress: true
15
+
16
+ jobs:
17
+ unit:
18
+ name: unit
19
+ runs-on: ubuntu-latest
20
+ steps:
21
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
22
+ - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
23
+ with:
24
+ python-version: "3.12"
25
+ - name: Install uv
26
+ run: python -m pip install --quiet uv
27
+ - run: uv sync --group dev
28
+ - run: uv run pytest tests/unit
29
+
30
+ integration:
31
+ name: integration
32
+ runs-on: ubuntu-latest
33
+ steps:
34
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
35
+ - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
36
+ with:
37
+ python-version: "3.12"
38
+ - name: Install uv
39
+ run: python -m pip install --quiet uv
40
+ - run: uv sync --group dev
41
+ - run: uv run pytest tests/integration
42
+
43
+ e2e:
44
+ name: e2e (in-process)
45
+ runs-on: ubuntu-latest
46
+ steps:
47
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
48
+ - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
49
+ with:
50
+ python-version: "3.12"
51
+ - name: Install uv
52
+ run: python -m pip install --quiet uv
53
+ - run: uv sync --group dev
54
+ - run: uv run pytest tests/e2e
55
+
56
+ schema:
57
+ name: schema
58
+ runs-on: ubuntu-latest
59
+ steps:
60
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
61
+ - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
62
+ with:
63
+ python-version: "3.12"
64
+ - run: python -c "import json; json.load(open('src/mayhem/schemas/output_v1.json'))"
65
+
66
+ ruff-fatal:
67
+ name: ruff (fatal subset)
68
+ runs-on: ubuntu-latest
69
+ steps:
70
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
71
+ - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
72
+ with:
73
+ python-version: "3.12"
74
+ - name: Install uv
75
+ run: python -m pip install --quiet uv
76
+ - run: uv sync --group dev
77
+ - run: uv run ruff check --select E9,F63,F7,F82,F821,F811 src/ tests/
78
+
79
+ package-build:
80
+ name: package build
81
+ runs-on: ubuntu-latest
82
+ needs: [unit, integration, e2e, ruff-fatal]
83
+ steps:
84
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
85
+ with:
86
+ fetch-depth: 0
87
+ - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
88
+ with:
89
+ python-version: "3.12"
90
+ - name: Install build tooling
91
+ run: python -m pip install --upgrade build
92
+ - run: python -m build --sdist --wheel
93
+ - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
94
+ with:
95
+ name: dist
96
+ path: dist/
97
+ if-no-files-found: error
98
+
99
+ wheel-smoke:
100
+ name: wheel install smoke
101
+ runs-on: ubuntu-latest
102
+ needs: package-build
103
+ steps:
104
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
105
+ - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
106
+ with:
107
+ python-version: "3.12"
108
+ - name: Install uv
109
+ run: python -m pip install --quiet uv
110
+ - uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
111
+ with:
112
+ name: dist
113
+ path: dist
114
+ - name: Run wheel smoke test
115
+ run: MAYHEM_PACKAGE_SMOKE=1 uv run pytest tests/package -q -rs
116
+
117
+ verify-artifacts:
118
+ name: verify release artifacts
119
+ runs-on: ubuntu-latest
120
+ needs: package-build
121
+ steps:
122
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
123
+ - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
124
+ with:
125
+ python-version: "3.12"
126
+ - uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
127
+ with:
128
+ name: dist
129
+ path: dist
130
+ - run: python scripts/verify_release_artifacts.py dist
131
+
132
+ advisory:
133
+ name: advisory quality checks
134
+ runs-on: ubuntu-latest
135
+ continue-on-error: true
136
+ steps:
137
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
138
+ - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
139
+ with:
140
+ python-version: "3.12"
141
+ - name: Install uv
142
+ run: python -m pip install --quiet uv
143
+ - run: uv sync --group dev
144
+ - run: uv run ruff check src/ tests/
145
+ - run: uv run mypy src/mayhem
146
+ - run: uv run lint-imports
@@ -0,0 +1,34 @@
1
+ name: Live Conformance
2
+
3
+ on:
4
+ workflow_dispatch:
5
+
6
+ permissions:
7
+ contents: read
8
+
9
+ jobs:
10
+ live-conformance:
11
+ name: live conformance (manual)
12
+ runs-on: ubuntu-latest
13
+ if: github.event_name == 'workflow_dispatch'
14
+ steps:
15
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
16
+ - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
17
+ with:
18
+ python-version: "3.12"
19
+ - name: Install uv
20
+ run: python -m pip install --quiet uv
21
+ - run: uv sync --group dev
22
+ - name: Record conformance environment
23
+ run: |
24
+ date -u +%Y-%m-%dT%H:%M:%SZ > conformance-environment.txt
25
+ uname -a >> conformance-environment.txt
26
+ docker version --format '{{.Server.Version}}' >> conformance-environment.txt 2>&1 || true
27
+ kubectl version -o json >> conformance-environment.txt 2>&1 || true
28
+ - name: Run unit conformance profile
29
+ run: uv run pytest tests/unit -m nightly -q
30
+ - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
31
+ with:
32
+ name: conformance-environment
33
+ path: conformance-environment.txt
34
+ if-no-files-found: error
@@ -25,14 +25,14 @@ jobs:
25
25
  run: python -m pip install --quiet uv
26
26
  - name: Sync dev dependencies
27
27
  run: uv sync --group dev
28
- - name: Run tests
29
- run: uv run pytest tests/unit tests/integration
28
+ - name: Run unit tests
29
+ run: uv run pytest tests/unit
30
+ - name: Run integration tests
31
+ run: uv run pytest tests/integration
30
32
  # NOTE: `ruff check src/` is NOT gated here — the repository's committed
31
33
  # ruff config currently reports 30-49 pre-existing violations under every
32
34
  # ruff generation (0.8-0.16); the project has no lint-green baseline in
33
35
  # its history. Land a lint-cleanup first, then re-add `ruff check src/`.
34
- - name: Architectural contracts
35
- run: uv run lint-imports
36
36
 
37
37
  build-and-publish:
38
38
  name: Build and publish to PyPI
@@ -7,6 +7,256 @@ This changelog is generated from the project's git history by
7
7
  **drill phase** that produced them (Explore / Expert / Coverage / Next) and
8
8
  by conventional-commit type — see the phase map below.
9
9
 
10
+ ## [unreleased]
11
+
12
+
13
+
14
+ ### 📚 Documentation
15
+
16
+ - Add v0.9.0 roadmap and implementation plans
17
+
18
+ - Establish the v0.9.0 release truth baseline: checked command inventory, install
19
+ dependency contract, version metadata, and Justfile recipe paths
20
+
21
+
22
+ ## 0.8.0 - 2026-09-25
23
+
24
+
25
+
26
+ ### 🚀 Features
27
+
28
+ - Kubernetes targeting system
29
+
30
+ - Refined target.py
31
+
32
+ - Kube topology structure
33
+
34
+ - Kube topology for cli
35
+
36
+ - **k8s**: K-plan-3 container-level signal execution
37
+
38
+ - Update executors.py
39
+
40
+ - Update k8s_resolve.py
41
+
42
+ - Update lease_client.py
43
+
44
+ - Update campaign.py
45
+
46
+ - Update lifecycle.py
47
+
48
+ - Update services.py
49
+
50
+ - Update config.py
51
+
52
+ - Update cell_runner.py
53
+
54
+ - Update executor.py
55
+
56
+ - Update k8s_runtime.py
57
+
58
+ - Update safety.py
59
+
60
+ - Update leases.py
61
+
62
+ - Update resolution.py
63
+
64
+ - Update lease_repository.py
65
+
66
+ - Extend executor agents with K8s runtime support
67
+
68
+ - Add K8s control plane agent
69
+
70
+ - Update CLI app for K8s executor integration
71
+
72
+ - Update coverage command for K8s runtime
73
+
74
+ - Update explore command for K8s runtime
75
+
76
+ - Update next command for K8s runtime
77
+
78
+ - Update services command for K8s runtime
79
+
80
+ - Update toolkit for K8s runtime
81
+
82
+ - Update topology for K8s runtime
83
+
84
+ - Update controller executor for K8s runtime
85
+
86
+ - Extend K8s runtime with execution support
87
+
88
+ - Extend fault catalog with K8s faults
89
+
90
+ - Update K8s example spec
91
+
92
+ - Update executor agents
93
+
94
+ - Update dependencies for K8s runtime
95
+
96
+ - Update K8s control agent
97
+
98
+ - Update lifecycle CLI for K8s
99
+
100
+ - Update services CLI for K8s
101
+
102
+ - Update K8s runtime controller
103
+
104
+ - Update planner for K8s runtime
105
+
106
+ - Extend fault catalog
107
+
108
+ - Update common domain for K8s
109
+
110
+ - Add K8s adapter domain
111
+
112
+ - Update maniac domain for K8s
113
+
114
+ - Add runtime adapter for K8s
115
+
116
+ - Update target selector for K8s
117
+
118
+ - Add K8s manifest topology provider
119
+
120
+ - Add policy, evidence, provider, and schema foundations
121
+
122
+ - Expand agent and controller execution flows
123
+
124
+ - Expand CLI commands and output handling
125
+
126
+ - Finalize active CLI workflow surface
127
+
128
+
129
+
130
+ ### 🐛 Bug Fixes
131
+
132
+ - Release.yml
133
+
134
+ - Initialize slotted CLI exceptions safely
135
+
136
+
137
+
138
+ ### 💼 Other
139
+
140
+ - Update docs/adr-adr-m7-1-k8s-executor-flip.md
141
+
142
+ - Delete docs/features.md
143
+
144
+ - Delete docs/k-plan-1.md
145
+
146
+
147
+
148
+ ### 🚜 Refactor
149
+
150
+ - Format and ruff-fix
151
+
152
+
153
+
154
+ ### 📚 Documentation
155
+
156
+ - Enhance readme file, removed dev version stuff
157
+
158
+ - Kubernetes plans/spec/adrs
159
+
160
+ - Update README.md
161
+
162
+ - Update adr-m7-1-k8s-executor.md
163
+
164
+ - Update config.md
165
+
166
+ - Update drill-spec.md
167
+
168
+ - Remove k-plan-2.md
169
+
170
+ - Remove k-plan-3-implementation-subplans.md
171
+
172
+ - Remove k-plan-3-sub-plans-k8s-executor-flip.md
173
+
174
+ - Remove k-plan-3-sub-plans.md
175
+
176
+ - Remove k-plan-3.md
177
+
178
+ - Remove k-plan-4-sub-plans.md
179
+
180
+ - Remove k-plan-4.md
181
+
182
+ - Remove k-plan-5.md
183
+
184
+ - Add k8s-plan-1.md
185
+
186
+ - Add k8s-plan-2.md
187
+
188
+ - Update architecture and reference documentation
189
+
190
+ - Clarify the default installation bundle
191
+
192
+
193
+
194
+ ### 🎨 Styling
195
+
196
+ - Remove obsolete noqa suppressions
197
+
198
+
199
+
200
+ ### 🧪 Testing
201
+
202
+ - Add tests for kube
203
+
204
+ - Update test_kplan3_runtime.py
205
+
206
+ - Update test_m7_k8s.py
207
+
208
+ - Update test_safety.py
209
+
210
+ - Add test_kplan5_runtime.py
211
+
212
+ - Update CLI tests for K8s runtime
213
+
214
+ - Update container fault matrix tests for K8s
215
+
216
+ - Update example specs YAML tests for K8s
217
+
218
+ - Update fault catalog tests for K8s faults
219
+
220
+ - Update K8s plan-3 runtime tests
221
+
222
+ - Update K8s plan-5 runtime tests
223
+
224
+ - Add K8s plan-6 runtime tests
225
+
226
+ - Update CLI tests for K8s runtime
227
+
228
+ - Update K8s plan-6 runtime tests
229
+
230
+ - Add K8s manifest topology tests
231
+
232
+ - Expand runtime, CLI, provider, and policy coverage
233
+
234
+ - Add exhaustive CLI and runtime coverage
235
+
236
+ - Pin compose topology discovery runtime
237
+
238
+
239
+
240
+ ### ⚙️ Miscellaneous Tasks
241
+
242
+ - Update development tooling and package metadata
243
+
244
+ - Add provider and container examples
245
+
246
+ - **release**: Bundle Kubernetes and parallelize unit tests
247
+
248
+ - Remove broken architecture gate from release
249
+
250
+
251
+ ## 0.6.2 - 2026-09-11
252
+
253
+
254
+
255
+ ### 🐛 Bug Fixes
256
+
257
+ - ApiVersion was not added to tests
258
+
259
+
10
260
  ## 0.6.0 - 2026-09-11
11
261
 
12
262
 
@@ -9,9 +9,10 @@ set shell := ["bash", "-euo", "pipefail", "-c"]
9
9
 
10
10
  _testcase := "examples/testCase"
11
11
  _compose := _testcase / "docker-compose.yml"
12
- _config := _testcase / "mayhem.yml"
12
+ _config := _testcase / "mayhem.yaml"
13
13
  _spec := _testcase / "mayhem.yaml"
14
14
  _db := ".mayhem/e2e.db"
15
+ _workers := "5"
15
16
 
16
17
  # ── setup ────────────────────────────────────────────────────────────────────
17
18
 
@@ -26,33 +27,33 @@ setup:
26
27
  # Discover topology from compose + live runtime (containers, processes, services)
27
28
  topology:
28
29
  @echo "=== topology discover ==="
29
- mayhem topology discover --compose {{ _compose }} | python3 -m json.tool > /dev/null
30
+ mayhem discover topology --compose {{ _compose }} | python3 -m json.tool > /dev/null
30
31
  @echo "✓ topology discover"
31
32
 
32
33
  # Topology with prefix shorthand
33
34
  topology-prefix:
34
35
  @echo "=== topology prefix ==="
35
- mayhem top d --compose {{ _compose }} | python3 -m json.tool > /dev/null
36
+ mayhem disc topo --compose {{ _compose }} | python3 -m json.tool > /dev/null
36
37
  @echo "✓ topology prefix"
37
38
 
38
39
  # ── toolkit ──────────────────────────────────────────────────────────────────
39
40
 
40
- # List available faults and capabilities
41
+ # List available faults and capabilities (`mayhem discover`)
41
42
  toolkit:
42
43
  @echo "=== toolkit ==="
43
- mayhem toolkit faults
44
- mayhem toolkit list --json | python3 -m json.tool > /dev/null
44
+ mayhem discover faults
45
+ mayhem discover capabilities --json | python3 -m json.tool > /dev/null
45
46
  @echo "✓ toolkit"
46
47
 
47
48
  # ── config ───────────────────────────────────────────────────────────────────
48
49
 
49
- # Show and validate effective config (default + testCase)
50
+ # Show and validate effective config (default + testCase) via `mayhem prepare config`
50
51
  config:
51
52
  @echo "=== config ==="
52
- mayhem config show --json | python3 -m json.tool > /dev/null
53
- mayhem --config {{ _config }} config show --json | python3 -m json.tool > /dev/null
54
- mayhem config validate
55
- mayhem --config {{ _config }} config validate
53
+ mayhem prepare config show --json | python3 -m json.tool > /dev/null
54
+ mayhem --config {{ _config }} prepare config show --json | python3 -m json.tool > /dev/null
55
+ mayhem prepare config validate
56
+ mayhem --config {{ _config }} prepare config validate
56
57
  @echo "✓ config"
57
58
 
58
59
  # ── experiment ───────────────────────────────────────────────────────────────
@@ -66,58 +67,57 @@ experiment:
66
67
 
67
68
  # ── lifecycle: validate → plan → run → status → history → recover ────────────
68
69
 
69
- # Validate spec against live topology
70
+ # Validate spec against live topology (`mayhem prepare validate`)
70
71
  validate: setup
71
72
  @echo "=== validate ==="
72
- mayhem --db {{ _db }} validate {{ _spec }} --compose {{ _compose }}
73
+ mayhem --db {{ _db }} prepare validate {{ _spec }} --compose {{ _compose }}
73
74
  @echo "✓ validate"
74
75
 
75
- # Validate with explicit process topology (no compose auto-detect)
76
- validate-process:
77
- @echo "=== validate --process ==="
78
- mayhem validate {{ _spec }} \
79
- --process "download-1=10001" --process "download-2=10002"
80
- @echo "✓ validate --process"
81
-
82
- # Plan the experiment
76
+ # Plan the experiment (`mayhem prepare plan`)
83
77
  plan:
84
78
  @echo "=== plan ==="
85
- mayhem plan {{ _spec }} --compose {{ _compose }}
79
+ mayhem prepare plan {{ _spec }} --compose {{ _compose }}
86
80
  @echo "✓ plan"
87
81
 
88
82
  # Full run: inject faults, record events, compensate
89
83
  run: setup
90
84
  @echo "=== run ==="
91
- mayhem --db {{ _db }} run {{ _spec }} --compose {{ _compose }}
85
+ mayhem --db {{ _db }} run {{ _spec }} --compose {{ _compose }} --execute
92
86
  @echo "✓ run"
93
87
 
94
- # Show run status (JSON + text)
88
+ # Show run status (text + JSON) via `mayhem inspect runs`
95
89
  status: setup
96
90
  @echo "=== status ==="
97
- mayhem --db {{ _db }} status
91
+ mayhem --db {{ _db }} inspect runs
92
+ mayhem --db {{ _db }} inspect runs --json | python3 -m json.tool > /dev/null
98
93
  @echo "✓ status"
99
94
 
100
- # Show detailed run history (JSON + text)
95
+ # Show detailed run history (text + JSON) via `mayhem inspect history`
101
96
  history:
102
97
  @echo "=== history ==="
103
98
  @run_id=$$(sqlite3 {{ _db }} "SELECT id FROM runs ORDER BY rowid DESC LIMIT 1" 2>/dev/null || echo ""); \
104
99
  if [ -z "$$run_id" ]; then \
105
100
  echo "⚠ no runs in DB — skipping history"; \
106
101
  else \
107
- mayhem --db {{ _db }} history "$$run_id"; \
102
+ mayhem --db {{ _db }} inspect history "$$run_id"; \
108
103
  echo "✓ history"; \
109
104
  fi
110
105
 
111
- # Recovery sweep (orphaned fault leases)
112
- recover: setup
106
+ # Recovery sweep (orphaned fault leases for the most recent run)
107
+ recover:
113
108
  @echo "=== recover ==="
114
- mayhem --db {{ _db }} recover
109
+ @run_id=$$(sqlite3 {{ _db }} "SELECT id FROM runs ORDER BY rowid DESC LIMIT 1" 2>/dev/null || echo ""); \
110
+ if [ -z "$$run_id" ]; then \
111
+ echo "⚠ no runs in DB — skipping recover"; \
112
+ else \
113
+ mayhem --db {{ _db }} recover execute "$$run_id"; \
114
+ fi
115
115
  @echo "✓ recover"
116
116
 
117
117
  # Janitor sweep (stale runs / resources)
118
118
  janitor: setup
119
119
  @echo "=== janitor ==="
120
- mayhem --db {{ _db }} janitor sweep
120
+ mayhem --db {{ _db }} janitor
121
121
  @echo "✓ janitor"
122
122
 
123
123
  # ── campaign CRUD ────────────────────────────────────────────────────────────
@@ -125,14 +125,16 @@ janitor: setup
125
125
  # Create, list, show, start, abort, delete a campaign
126
126
  campaign: setup
127
127
  @echo "=== campaign ==="
128
- mayhem --db {{ _db }} campaign create --name "e2e-campaign" --hypothesis "stack survives chaos"
128
+ mayhem --db {{ _db }} campaign create "e2e-campaign" --hypothesis "stack survives chaos"
129
129
  mayhem --db {{ _db }} campaign list
130
- @cid=$$(sqlite3 {{ _db }} "SELECT id FROM campaigns ORDER BY rowid DESC LIMIT 1"); \
130
+ @cid=$$(sqlite3 {{ _db }} "SELECT id FROM campaigns WHERE name = 'e2e-campaign' ORDER BY rowid DESC LIMIT 1"); \
131
131
  mayhem --db {{ _db }} campaign show "$$cid"; \
132
132
  mayhem --db {{ _db }} campaign status "$$cid"; \
133
133
  mayhem --db {{ _db }} campaign start "$$cid" || true; \
134
- mayhem --db {{ _db }} campaign abort "$$cid" || true; \
135
- mayhem --db {{ _db }} campaign delete "$$cid"
134
+ mayhem --db {{ _db }} campaign abort "$$cid" || true
135
+ mayhem --db {{ _db }} campaign create "e2e-delete-campaign"
136
+ @delete_cid=$$(sqlite3 {{ _db }} "SELECT id FROM campaigns WHERE name = 'e2e-delete-campaign' ORDER BY rowid DESC LIMIT 1"); \
137
+ mayhem --db {{ _db }} campaign delete --yes "$$delete_cid"
136
138
  @echo "✓ campaign"
137
139
 
138
140
  # ── full round-trip ─────────────────────────────────────────────────────────
@@ -140,13 +142,13 @@ campaign: setup
140
142
  # Full lifecycle: validate → plan → run → status → history → recover
141
143
  full: setup
142
144
  @echo "=== full round-trip ==="
143
- mayhem --db {{ _db }} validate {{ _spec }} --compose {{ _compose }}
144
- mayhem --db {{ _db }} plan {{ _spec }} --compose {{ _compose }}
145
- mayhem --db {{ _db }} run {{ _spec }} --compose {{ _compose }}
146
- mayhem --db {{ _db }} status
145
+ mayhem --db {{ _db }} prepare validate {{ _spec }} --compose {{ _compose }}
146
+ mayhem --db {{ _db }} prepare plan {{ _spec }} --compose {{ _compose }}
147
+ mayhem --db {{ _db }} run {{ _spec }} --compose {{ _compose }} --execute
148
+ mayhem --db {{ _db }} inspect runs
147
149
  @run_id=$$(sqlite3 {{ _db }} "SELECT id FROM runs ORDER BY rowid DESC LIMIT 1"); \
148
- mayhem --db {{ _db }} history "$$run_id"
149
- mayhem --db {{ _db }} recover
150
+ mayhem --db {{ _db }} inspect history "$$run_id"; \
151
+ mayhem --db {{ _db }} recover execute "$$run_id"
150
152
  @echo "✓ full round-trip"
151
153
 
152
154
  # ── stack management ─────────────────────────────────────────────────────────
@@ -169,7 +171,7 @@ stack-down:
169
171
  # Run unit tests
170
172
  test-unit:
171
173
  @echo "=== unit tests ==="
172
- python3 -m pytest tests/unit/ -v --tb=short
174
+ python3 -m pytest tests/unit/ -n {{ _workers }} --dist loadfile -v --tb=short
173
175
  @echo "✓ unit tests"
174
176
 
175
177
  # Run e2e tests (in-process, no containers needed)
@@ -190,6 +192,18 @@ lint:
190
192
  ruff check src/ tests/
191
193
  @echo "✓ lint"
192
194
 
195
+ # Check the release truth baseline (docs/Justfile/packaging vs. the source)
196
+ contract:
197
+ @echo "=== release contract ==="
198
+ python3 -m pytest tests/unit/test_release_contract.py -v --tb=short
199
+ @echo "✓ release contract"
200
+
201
+ # Build the sdist and wheel
202
+ build:
203
+ @echo "=== build ==="
204
+ python3 -m build --sdist --wheel
205
+ @echo "✓ build"
206
+
193
207
  # ── aggregate targets ────────────────────────────────────────────────────────
194
208
 
195
209
  # Quick smoke: topology + toolkit + config + experiment + validate + plan