tracefork 0.2.1__tar.gz → 0.3.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.
- {tracefork-0.2.1 → tracefork-0.3.0}/.github/workflows/ci.yml +3 -1
- tracefork-0.3.0/.github/workflows/mutation.yml +46 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/.github/workflows/release.yml +2 -2
- {tracefork-0.2.1 → tracefork-0.3.0}/.gitignore +3 -0
- tracefork-0.3.0/CHANGELOG.md +723 -0
- tracefork-0.3.0/CLAUDE.md +962 -0
- tracefork-0.3.0/PKG-INFO +306 -0
- tracefork-0.3.0/README.md +233 -0
- tracefork-0.3.0/docs/plugin-api.md +171 -0
- tracefork-0.3.0/docs/session-cross-tape-design-spike.md +149 -0
- tracefork-0.3.0/examples/plugin_example/README.md +35 -0
- tracefork-0.3.0/examples/plugin_example/plugin_example/__init__.py +3 -0
- tracefork-0.3.0/examples/plugin_example/plugin_example/matcher.py +67 -0
- tracefork-0.3.0/examples/plugin_example/pyproject.toml +24 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/pyproject.toml +26 -1
- tracefork-0.3.0/scripts/check_executed_evidence.py +168 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/scripts/e2e.sh +5 -2
- tracefork-0.3.0/scripts/mutation.sh +35 -0
- tracefork-0.3.0/scripts/mutation_summary.py +180 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/__init__.py +6 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/adapters/__init__.py +10 -3
- tracefork-0.3.0/src/tracefork/adapters/shepherd.py +267 -0
- tracefork-0.3.0/src/tracefork/archetypes.py +498 -0
- tracefork-0.3.0/src/tracefork/basis.py +122 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/bedrock_transport.py +3 -2
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/bench.py +37 -4
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/blame.py +420 -44
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/boundary_guard.py +141 -1
- tracefork-0.3.0/src/tracefork/bundle.py +122 -0
- tracefork-0.3.0/src/tracefork/certificate.py +134 -0
- tracefork-0.3.0/src/tracefork/checkpoint.py +204 -0
- tracefork-0.3.0/src/tracefork/checkpoint_stream.py +98 -0
- tracefork-0.3.0/src/tracefork/ci_calibration.py +207 -0
- tracefork-0.3.0/src/tracefork/cli.py +2928 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/competing_faults.py +222 -1
- tracefork-0.3.0/src/tracefork/concurrent_validate.py +422 -0
- tracefork-0.3.0/src/tracefork/confinement_diagnostics.py +80 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/constants.py +27 -1
- tracefork-0.3.0/src/tracefork/convergence.py +137 -0
- tracefork-0.3.0/src/tracefork/corpus.py +229 -0
- tracefork-0.3.0/src/tracefork/cost_profile.py +157 -0
- tracefork-0.3.0/src/tracefork/coverage.py +227 -0
- tracefork-0.3.0/src/tracefork/cross_tape_blame.py +165 -0
- tracefork-0.3.0/src/tracefork/diff.py +169 -0
- tracefork-0.3.0/src/tracefork/effects.py +279 -0
- tracefork-0.3.0/src/tracefork/field_oracle.py +126 -0
- tracefork-0.3.0/src/tracefork/fork.py +730 -0
- tracefork-0.3.0/src/tracefork/fork_allowlist.py +110 -0
- tracefork-0.3.0/src/tracefork/fsck.py +116 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/interop.py +74 -10
- tracefork-0.3.0/src/tracefork/live.py +73 -0
- tracefork-0.3.0/src/tracefork/locate.py +130 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/matcher.py +11 -0
- tracefork-0.3.0/src/tracefork/narrative.py +105 -0
- tracefork-0.3.0/src/tracefork/nondet.py +227 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/providers/__init__.py +8 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/providers/anthropic.py +12 -2
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/providers/base.py +61 -2
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/providers/bedrock.py +36 -10
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/providers/gemini.py +35 -13
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/providers/openai.py +12 -2
- tracefork-0.3.0/src/tracefork/query.py +241 -0
- tracefork-0.3.0/src/tracefork/receipt.py +160 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/record_mode.py +18 -20
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/recorder.py +105 -4
- tracefork-0.3.0/src/tracefork/release_receipt.py +276 -0
- tracefork-0.3.0/src/tracefork/repl.py +59 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/replay.py +45 -2
- tracefork-0.3.0/src/tracefork/report.py +247 -0
- tracefork-0.3.0/src/tracefork/report_session.py +114 -0
- tracefork-0.3.0/src/tracefork/selfaudit.py +136 -0
- tracefork-0.3.0/src/tracefork/server.py +287 -0
- tracefork-0.3.0/src/tracefork/session_chaos.py +114 -0
- tracefork-0.3.0/src/tracefork/session_cost.py +134 -0
- tracefork-0.3.0/src/tracefork/session_ops.py +137 -0
- tracefork-0.3.0/src/tracefork/session_replay.py +133 -0
- tracefork-0.3.0/src/tracefork/settlement.py +228 -0
- tracefork-0.3.0/src/tracefork/store.py +1403 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/tape.py +104 -14
- tracefork-0.3.0/src/tracefork/tapequery.py +101 -0
- tracefork-0.3.0/src/tracefork/tournament.py +397 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/transport.py +77 -5
- tracefork-0.3.0/tests/fixtures/fork_ui_agent.py +21 -0
- tracefork-0.3.0/tests/required_test_ids.txt +70 -0
- tracefork-0.3.0/tests/test_adapter_fork_blame_parity.py +167 -0
- tracefork-0.3.0/tests/test_adapters_shepherd.py +258 -0
- tracefork-0.3.0/tests/test_archetypes.py +159 -0
- tracefork-0.3.0/tests/test_basis.py +167 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_bench.py +11 -9
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_blame.py +463 -0
- tracefork-0.3.0/tests/test_blame_heatmap.py +206 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_boundary_guard.py +91 -1
- tracefork-0.3.0/tests/test_branch_queries.py +282 -0
- tracefork-0.3.0/tests/test_bundle.py +205 -0
- tracefork-0.3.0/tests/test_causal_edges.py +235 -0
- tracefork-0.3.0/tests/test_certificate.py +175 -0
- tracefork-0.3.0/tests/test_check_executed_evidence.py +130 -0
- tracefork-0.3.0/tests/test_checkpoint.py +151 -0
- tracefork-0.3.0/tests/test_checkpoint_stream.py +179 -0
- tracefork-0.3.0/tests/test_ci_calibration.py +100 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_cli.py +32 -0
- tracefork-0.3.0/tests/test_cli_session_board.py +106 -0
- tracefork-0.3.0/tests/test_cli_smoke.py +947 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_competing_faults.py +58 -0
- tracefork-0.3.0/tests/test_concurrent_validate.py +107 -0
- tracefork-0.3.0/tests/test_confinement_diagnostics.py +206 -0
- tracefork-0.3.0/tests/test_confinement_risk.py +202 -0
- tracefork-0.3.0/tests/test_confinement_tier.py +333 -0
- tracefork-0.3.0/tests/test_convergence.py +197 -0
- tracefork-0.3.0/tests/test_corpus.py +304 -0
- tracefork-0.3.0/tests/test_cost_profile.py +179 -0
- tracefork-0.3.0/tests/test_coverage.py +132 -0
- tracefork-0.3.0/tests/test_cross_tape_blame.py +336 -0
- tracefork-0.3.0/tests/test_diff.py +206 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_e2e.py +5 -4
- tracefork-0.3.0/tests/test_effects.py +229 -0
- tracefork-0.3.0/tests/test_field_oracle.py +159 -0
- tracefork-0.3.0/tests/test_fork.py +664 -0
- tracefork-0.3.0/tests/test_fork_endpoint.py +206 -0
- tracefork-0.3.0/tests/test_fsck.py +107 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_interop.py +53 -0
- tracefork-0.3.0/tests/test_live.py +95 -0
- tracefork-0.3.0/tests/test_locate.py +325 -0
- tracefork-0.3.0/tests/test_mutation_summary.py +202 -0
- tracefork-0.3.0/tests/test_narrative.py +218 -0
- tracefork-0.3.0/tests/test_nondet_env.py +197 -0
- tracefork-0.3.0/tests/test_nondet_read_file.py +189 -0
- tracefork-0.3.0/tests/test_otel_locate.py +88 -0
- tracefork-0.3.0/tests/test_plugin_example.py +114 -0
- tracefork-0.3.0/tests/test_property_ci_nesting.py +131 -0
- tracefork-0.3.0/tests/test_property_matcher.py +63 -0
- tracefork-0.3.0/tests/test_property_tape.py +130 -0
- tracefork-0.3.0/tests/test_provider_capabilities.py +89 -0
- tracefork-0.3.0/tests/test_query.py +270 -0
- tracefork-0.3.0/tests/test_receipt.py +271 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_record_mode.py +11 -12
- tracefork-0.3.0/tests/test_release_receipt.py +332 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_replay.py +37 -1
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_report.py +133 -1
- tracefork-0.3.0/tests/test_report_causal_forktree.py +193 -0
- tracefork-0.3.0/tests/test_report_scrubber.py +80 -0
- tracefork-0.3.0/tests/test_report_session.py +118 -0
- tracefork-0.3.0/tests/test_report_slice_vocabulary.py +189 -0
- tracefork-0.3.0/tests/test_runs_page.py +72 -0
- tracefork-0.3.0/tests/test_selfaudit.py +81 -0
- tracefork-0.3.0/tests/test_session_chaos.py +214 -0
- tracefork-0.3.0/tests/test_session_cost.py +207 -0
- tracefork-0.3.0/tests/test_session_replay.py +329 -0
- tracefork-0.3.0/tests/test_session_verbs.py +458 -0
- tracefork-0.3.0/tests/test_sessions.py +231 -0
- tracefork-0.3.0/tests/test_settlement.py +209 -0
- tracefork-0.3.0/tests/test_shapley_report_panel.py +138 -0
- tracefork-0.3.0/tests/test_storage.py +939 -0
- tracefork-0.3.0/tests/test_storage_multiprocess.py +97 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_tape.py +29 -0
- tracefork-0.3.0/tests/test_tapequery.py +161 -0
- tracefork-0.3.0/tests/test_tournament.py +244 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_transport.py +69 -0
- tracefork-0.3.0/tests/test_url_model_detection.py +302 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/uv.lock +215 -2
- tracefork-0.3.0/web/report.html +817 -0
- tracefork-0.3.0/web/runs.html +84 -0
- tracefork-0.3.0/web/session_report.html +198 -0
- tracefork-0.2.1/CHANGELOG.md +0 -163
- tracefork-0.2.1/CLAUDE.md +0 -241
- tracefork-0.2.1/PKG-INFO +0 -636
- tracefork-0.2.1/README.md +0 -566
- tracefork-0.2.1/src/tracefork/cli.py +0 -766
- tracefork-0.2.1/src/tracefork/fork.py +0 -370
- tracefork-0.2.1/src/tracefork/nondet.py +0 -119
- tracefork-0.2.1/src/tracefork/report.py +0 -137
- tracefork-0.2.1/src/tracefork/server.py +0 -73
- tracefork-0.2.1/src/tracefork/store.py +0 -175
- tracefork-0.2.1/tests/test_cli_smoke.py +0 -360
- tracefork-0.2.1/tests/test_fork.py +0 -313
- tracefork-0.2.1/tests/test_storage.py +0 -248
- tracefork-0.2.1/web/report.html +0 -308
- {tracefork-0.2.1 → tracefork-0.3.0}/.editorconfig +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/.github/dependabot.yml +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/.github/pull_request_template.md +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/.pre-commit-config.yaml +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/CODE_OF_CONDUCT.md +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/CONTRIBUTING.md +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/LICENSE +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/SECURITY.md +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/SPIKE0.md +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/docs/demo.png +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/docs/packaging-decisions.md +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/examples/demo_report.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/experiments/replay_fixtures/manifest.json +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/experiments/replay_fixtures/single_turn.tape.sqlite +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/experiments/replay_fixtures/two_turn.tape.sqlite +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/experiments/validation_report_committed.json +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/scripts/gen_replay_fixtures.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/adapters/adk.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/adapters/autogen.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/adapters/base.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/adapters/crewai.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/adapters/langchain.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/adapters/openai_agents.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/config.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/data/pricing.json +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/divergence.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/eventstream.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/faults.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/fixtures.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/judge.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/mcp_client.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/observability.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/plugins.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/pricing.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/proxy.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/py.typed +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/redact.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/synthetic.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/tools.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/validate.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/wire.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork_spike/__init__.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork_spike/__main__.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork_spike/agent.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork_spike/fake_llm.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork_spike/nondet.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork_spike/spike.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork_spike/tape.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork_spike/transport.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/__init__.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/fakes.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/fixtures/legacy_tape_v1.blob +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_adapters_adk.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_adapters_autogen.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_adapters_base.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_adapters_crewai.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_adapters_langchain.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_adapters_openai_agents.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_bedrock_eventstream.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_bedrock_provider.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_bedrock_transport.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_concurrency.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_config.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_divergence.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_faults.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_gemini_provider.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_judge.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_matcher.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_mcp_client.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_nondet.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_observability.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_openai_provider.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_plugins.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_pricing.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_provider_faults.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_providers.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_proxy.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_recorder.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_redact.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_spike0.py +0 -0
- {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_tools.py +0 -0
|
@@ -27,7 +27,9 @@ jobs:
|
|
|
27
27
|
- name: Type check
|
|
28
28
|
run: uv run mypy src/tracefork
|
|
29
29
|
- name: Tests + coverage
|
|
30
|
-
run: uv run pytest -q --cov --cov-report=term-missing
|
|
30
|
+
run: uv run pytest -q --cov --cov-report=term-missing --junit-xml=junit.xml
|
|
31
|
+
- name: Executed-evidence CI sentinel
|
|
32
|
+
run: uv run python scripts/check_executed_evidence.py
|
|
31
33
|
- name: Self-validation regression gate
|
|
32
34
|
run: uv run tracefork validate --check
|
|
33
35
|
- name: Build distribution
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
name: Mutation testing
|
|
2
|
+
|
|
3
|
+
# Nightly, informational-only mutation-testing pass over the four
|
|
4
|
+
# proof-bearing modules (transport/tape/matcher/blame) via mutmut — see
|
|
5
|
+
# scripts/mutation_summary.py's module docstring for the full rationale.
|
|
6
|
+
#
|
|
7
|
+
# Deliberately triggers ONLY on a schedule + manual dispatch, never on
|
|
8
|
+
# `push`/`pull_request`: this job is structurally incapable of blocking a
|
|
9
|
+
# merge. `continue-on-error: true` on the job is belt-and-suspenders on top
|
|
10
|
+
# of that (and on top of scripts/mutation.sh / scripts/mutation_summary.py
|
|
11
|
+
# each already exiting 0 by design).
|
|
12
|
+
|
|
13
|
+
on:
|
|
14
|
+
schedule:
|
|
15
|
+
- cron: "0 7 * * *" # nightly, 07:00 UTC
|
|
16
|
+
workflow_dispatch:
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
mutation:
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
continue-on-error: true
|
|
22
|
+
steps:
|
|
23
|
+
- uses: actions/checkout@v7
|
|
24
|
+
- name: Install uv
|
|
25
|
+
uses: astral-sh/setup-uv@v7
|
|
26
|
+
with:
|
|
27
|
+
python-version: "3.12"
|
|
28
|
+
- name: Install dependencies
|
|
29
|
+
run: uv sync --extra dev --extra mutation
|
|
30
|
+
- name: Seed coverage data for mutmut --use-coverage
|
|
31
|
+
run: uv run pytest -q --cov
|
|
32
|
+
- name: Run mutmut over transport/tape/matcher/blame
|
|
33
|
+
run: uv run mutmut run --use-coverage || true
|
|
34
|
+
- name: Export mutmut results as JUnit XML
|
|
35
|
+
run: uv run mutmut junitxml > mutmut-junit.xml
|
|
36
|
+
- name: Summarize mutation results
|
|
37
|
+
run: uv run python scripts/mutation_summary.py --junit-xml mutmut-junit.xml || true
|
|
38
|
+
- name: Upload mutation report
|
|
39
|
+
if: always()
|
|
40
|
+
uses: actions/upload-artifact@v4
|
|
41
|
+
with:
|
|
42
|
+
name: mutation-report
|
|
43
|
+
path: |
|
|
44
|
+
mutmut-junit.xml
|
|
45
|
+
.mutmut-cache
|
|
46
|
+
if-no-files-found: warn
|
|
@@ -20,9 +20,9 @@ jobs:
|
|
|
20
20
|
permissions:
|
|
21
21
|
id-token: write # OIDC token for PyPI Trusted Publishing
|
|
22
22
|
steps:
|
|
23
|
-
- uses: actions/checkout@
|
|
23
|
+
- uses: actions/checkout@v7
|
|
24
24
|
- name: Install uv
|
|
25
|
-
uses: astral-sh/setup-uv@
|
|
25
|
+
uses: astral-sh/setup-uv@v7
|
|
26
26
|
with:
|
|
27
27
|
python-version: "3.12"
|
|
28
28
|
- name: Build sdist and wheel
|
|
@@ -17,9 +17,11 @@ __pycache__/
|
|
|
17
17
|
/store.db
|
|
18
18
|
/report.html
|
|
19
19
|
/blame_*.json
|
|
20
|
+
/tournament_*.json
|
|
20
21
|
/validation_report.json
|
|
21
22
|
/bench_report.json
|
|
22
23
|
/examples/demo_report.html
|
|
24
|
+
/junit.xml
|
|
23
25
|
|
|
24
26
|
# Build, coverage, and tool caches (regenerated on demand)
|
|
25
27
|
/dist/
|
|
@@ -34,3 +36,4 @@ docs/superpowers/
|
|
|
34
36
|
.beads/
|
|
35
37
|
planning/
|
|
36
38
|
.superpowers/
|
|
39
|
+
blame_*.md
|