tracefork 0.2.2__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.3.0/.github/workflows/mutation.yml +46 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/.gitignore +1 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/CHANGELOG.md +59 -1
- {tracefork-0.2.2 → tracefork-0.3.0}/CLAUDE.md +414 -23
- tracefork-0.3.0/PKG-INFO +306 -0
- tracefork-0.3.0/README.md +233 -0
- tracefork-0.3.0/docs/session-cross-tape-design-spike.md +149 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/pyproject.toml +21 -1
- tracefork-0.3.0/scripts/mutation.sh +35 -0
- tracefork-0.3.0/scripts/mutation_summary.py +180 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/__init__.py +3 -0
- {tracefork-0.2.2 → 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.2 → tracefork-0.3.0}/src/tracefork/bedrock_transport.py +3 -2
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/blame.py +129 -12
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/boundary_guard.py +36 -3
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/checkpoint.py +53 -0
- tracefork-0.3.0/src/tracefork/checkpoint_stream.py +98 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/cli.py +1376 -42
- 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.2 → tracefork-0.3.0}/src/tracefork/constants.py +23 -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.2.2 → tracefork-0.3.0}/src/tracefork/coverage.py +3 -3
- tracefork-0.3.0/src/tracefork/cross_tape_blame.py +165 -0
- tracefork-0.3.0/src/tracefork/effects.py +279 -0
- tracefork-0.3.0/src/tracefork/field_oracle.py +126 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/fork.py +34 -0
- tracefork-0.3.0/src/tracefork/fork_allowlist.py +110 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/interop.py +48 -4
- tracefork-0.3.0/src/tracefork/live.py +73 -0
- tracefork-0.3.0/src/tracefork/locate.py +130 -0
- tracefork-0.3.0/src/tracefork/narrative.py +105 -0
- tracefork-0.3.0/src/tracefork/nondet.py +227 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/providers/__init__.py +8 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/providers/anthropic.py +12 -2
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/providers/base.py +61 -2
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/providers/bedrock.py +36 -10
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/providers/gemini.py +35 -13
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/providers/openai.py +12 -2
- tracefork-0.3.0/src/tracefork/query.py +241 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/recorder.py +32 -1
- tracefork-0.3.0/src/tracefork/release_receipt.py +276 -0
- tracefork-0.3.0/src/tracefork/repl.py +59 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/report.py +88 -1
- 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.2.2 → tracefork-0.3.0}/src/tracefork/store.py +222 -16
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/tape.py +63 -14
- tracefork-0.3.0/src/tracefork/tapequery.py +101 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/transport.py +3 -3
- tracefork-0.3.0/tests/fixtures/fork_ui_agent.py +21 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/required_test_ids.txt +15 -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.3.0/tests/test_blame_heatmap.py +206 -0
- tracefork-0.3.0/tests/test_branch_queries.py +282 -0
- tracefork-0.3.0/tests/test_checkpoint_stream.py +179 -0
- tracefork-0.3.0/tests/test_cli_session_board.py +106 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_cli_smoke.py +55 -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_cross_tape_blame.py +336 -0
- 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_endpoint.py +206 -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_property_ci_nesting.py +131 -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_release_receipt.py +332 -0
- 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_settlement.py +209 -0
- tracefork-0.3.0/tests/test_shapley_report_panel.py +138 -0
- tracefork-0.3.0/tests/test_storage_multiprocess.py +97 -0
- tracefork-0.3.0/tests/test_tapequery.py +161 -0
- tracefork-0.3.0/tests/test_url_model_detection.py +302 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/uv.lock +157 -2
- {tracefork-0.2.2 → tracefork-0.3.0}/web/report.html +380 -7
- tracefork-0.3.0/web/runs.html +84 -0
- tracefork-0.3.0/web/session_report.html +198 -0
- tracefork-0.2.2/PKG-INFO +0 -747
- tracefork-0.2.2/README.md +0 -676
- tracefork-0.2.2/src/tracefork/nondet.py +0 -119
- tracefork-0.2.2/src/tracefork/server.py +0 -101
- {tracefork-0.2.2 → tracefork-0.3.0}/.editorconfig +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/.github/dependabot.yml +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/.github/pull_request_template.md +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/.github/workflows/ci.yml +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/.github/workflows/release.yml +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/.pre-commit-config.yaml +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/CODE_OF_CONDUCT.md +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/CONTRIBUTING.md +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/LICENSE +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/SECURITY.md +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/SPIKE0.md +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/docs/demo.png +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/docs/packaging-decisions.md +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/docs/plugin-api.md +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/examples/demo_report.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/examples/plugin_example/README.md +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/examples/plugin_example/plugin_example/__init__.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/examples/plugin_example/plugin_example/matcher.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/examples/plugin_example/pyproject.toml +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/experiments/replay_fixtures/manifest.json +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/experiments/replay_fixtures/single_turn.tape.sqlite +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/experiments/replay_fixtures/two_turn.tape.sqlite +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/experiments/validation_report_committed.json +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/scripts/check_executed_evidence.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/scripts/e2e.sh +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/scripts/gen_replay_fixtures.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/adapters/adk.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/adapters/autogen.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/adapters/base.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/adapters/crewai.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/adapters/langchain.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/adapters/openai_agents.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/bench.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/bundle.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/certificate.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/ci_calibration.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/competing_faults.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/config.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/data/pricing.json +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/diff.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/divergence.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/eventstream.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/faults.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/fixtures.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/fsck.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/judge.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/matcher.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/mcp_client.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/observability.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/plugins.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/pricing.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/proxy.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/py.typed +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/receipt.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/record_mode.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/redact.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/replay.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/synthetic.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/tools.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/tournament.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/validate.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork/wire.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork_spike/__init__.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork_spike/__main__.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork_spike/agent.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork_spike/fake_llm.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork_spike/nondet.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork_spike/spike.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork_spike/tape.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/src/tracefork_spike/transport.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/__init__.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/fakes.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/fixtures/legacy_tape_v1.blob +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_adapters_adk.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_adapters_autogen.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_adapters_base.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_adapters_crewai.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_adapters_langchain.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_adapters_openai_agents.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_bedrock_eventstream.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_bedrock_provider.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_bedrock_transport.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_bench.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_blame.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_boundary_guard.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_bundle.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_causal_edges.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_certificate.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_check_executed_evidence.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_checkpoint.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_ci_calibration.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_cli.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_competing_faults.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_concurrency.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_config.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_coverage.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_diff.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_divergence.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_e2e.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_faults.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_fork.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_fsck.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_gemini_provider.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_interop.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_judge.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_matcher.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_mcp_client.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_nondet.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_observability.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_openai_provider.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_plugin_example.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_plugins.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_pricing.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_property_matcher.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_property_tape.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_provider_faults.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_providers.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_proxy.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_receipt.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_record_mode.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_recorder.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_redact.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_replay.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_report.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_sessions.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_spike0.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_storage.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_tape.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_tools.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_tournament.py +0 -0
- {tracefork-0.2.2 → tracefork-0.3.0}/tests/test_transport.py +0 -0
|
@@ -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
|
|
@@ -7,6 +7,63 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.3.0] - 2026-07-17
|
|
11
|
+
|
|
12
|
+
This release lands the full **P2 + P3 improvement backlog (44 items)**, completing the
|
|
13
|
+
roadmap whose P0 + P1 tier shipped in 0.2.2. It closes the three structural fronts that
|
|
14
|
+
review identified (a persistent queryable causal/branch graph, confinement of
|
|
15
|
+
re-executing forks, and richer time-travel query primitives) while pushing the
|
|
16
|
+
causal-blame crown jewel further — all as additive
|
|
17
|
+
modules preserving every load-bearing invariant (`Tape.digest()` byte-stability, the
|
|
18
|
+
offline/$0 suite, `NondetSource` as the sole nondeterminism seam, the self-contained
|
|
19
|
+
single-file `web/report.html`). Tape envelope advances to **v6** (an optional per-exchange
|
|
20
|
+
`request_urls`, metadata-only and proven excluded from `digest()`). Suite: **1306 tests
|
|
21
|
+
(+416)**, ruff/mypy clean, wheel + demo report verified end-to-end.
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
|
|
25
|
+
- **Time-travel query primitives** — `tapequery.py` (`state_at`/`slice` fold-style views),
|
|
26
|
+
`locate.py` content-addressed value-locate receipts, `query.py`/`repl.py` a minimal query
|
|
27
|
+
surface + REPL, recursive fork-tree DAG queries (`store` branch descendants/ancestors/
|
|
28
|
+
siblings + `tracefork branch` sub-app + `GET /api/branch/{id}/related`), `narrative.py`
|
|
29
|
+
deterministic causal-explanation markdown, and `field_oracle.py` field-level
|
|
30
|
+
provenance-of-value blame (`blame --field`).
|
|
31
|
+
- **Forking & counterfactuals** — `convergence.py` proves two same-divergence-step branches
|
|
32
|
+
reconverged by per-exchange fingerprint equality (`tracefork converge`); `basis.py`
|
|
33
|
+
RecordBasis drift marker (tracefork version / git SHA, non-fatal warning on replay/fork);
|
|
34
|
+
`settlement.py` settlement-adjacent side-effect diff export (`settlement-diff`);
|
|
35
|
+
`effects.py` conflict-aware overlap diff for parallel/speculative branches.
|
|
36
|
+
- **Causal attribution & blame** — `archetypes.py` declarative fault-scenario generator,
|
|
37
|
+
`concurrent_validate.py` concurrent-branch (`asyncio.gather`) ground-truth fixture,
|
|
38
|
+
`cross_tape_blame.py` coalition blame across sub-agent tapes (`session cross-blame`),
|
|
39
|
+
`corpus.py` cross-tape corpus blame index (`corpus-blame`), a Clopper-Pearson ⊇
|
|
40
|
+
Wilson/Jeffreys/Agresti-Coull CI-nesting property test, and Slice selected/anchor/
|
|
41
|
+
evidence rendering vocabulary.
|
|
42
|
+
- **Providers & frameworks** — URL-path model detection (tape v6 `request_urls`, adapter
|
|
43
|
+
`detect_model` fallback, blame/interop resolution for Bedrock/Gemini), scoped
|
|
44
|
+
`ProviderCapabilities` manifest, `adapters/shepherd.py` (OpenAI-path interop), and a
|
|
45
|
+
cross-framework fork/blame parity test matrix.
|
|
46
|
+
- **Determinism & sandboxing** — `NondetSource` gains `read_file` (size-capped, zero-fs on
|
|
47
|
+
replay) and `get_env` draw kinds; confinement-risk pre-flight budget disclosure
|
|
48
|
+
(`BudgetGovernor.confinement_risk`, `blame --writable-root`/`--allowed-host`), confinement
|
|
49
|
+
tier tagging on Tape/Branch, and `confinement_diagnostics.py` divergence-style diagnostics.
|
|
50
|
+
- **Proof & validation rigor** — multi-process concurrent-write stress test, `selfaudit.py`
|
|
51
|
+
AST-level architectural self-audit, a scoped `mutmut` mutation-testing gate
|
|
52
|
+
(`scripts/mutation.sh` + nightly workflow, `[tool.mutmut]`), and `release_receipt.py`
|
|
53
|
+
aggregated (optionally HMAC-signed) verification receipt.
|
|
54
|
+
- **Multi-agent orchestration** — `session_cost.py` minimal-recompute fork cost model,
|
|
55
|
+
`session_replay.py` earliest-divergence rollup, `session_chaos.py` orchestration-scale
|
|
56
|
+
interleaving replay (`session chaos`), the `session` verb family (`session_ops.py`) +
|
|
57
|
+
cross-tape design spike, and `report_session.py`/`web/session_report.html` a multi-agent
|
|
58
|
+
fork-board report (`session board`).
|
|
59
|
+
- **Observability & UX** — timeline scrubber (play/step, timestamp-proportional ticks),
|
|
60
|
+
`cost_profile.py` cost/profile dashboard panel, Shapley necessity/sufficiency quadrant
|
|
61
|
+
badges (`report --shapley-report`), blame heatmap overlay on the fork tree, OTel exemplar
|
|
62
|
+
back-link (`GET /otel/{trace}/{span}` → run/step), click-to-fork inline UI
|
|
63
|
+
(`fork_allowlist.py`-gated `POST /api/run/{id}/fork`, $0-safe), a multi-run run-picker page
|
|
64
|
+
(`web/runs.html`, `GET /runs`), a live-tail checkpoint SSE endpoint (`live.py`), and the
|
|
65
|
+
causal fork-tree promoted to a first-class default report artifact.
|
|
66
|
+
|
|
10
67
|
## [0.2.2] - 2026-07-10
|
|
11
68
|
|
|
12
69
|
This release lands the full **P0 + P1 improvement backlog (28 items)**: hardening
|
|
@@ -658,7 +715,8 @@ everything below is additive around it: all engine internals stay byte-stable,
|
|
|
658
715
|
- `src/tracefork_spike/` — the original Spike 0 that de-risked bit-exact, no-key replay
|
|
659
716
|
within the declared determinism boundary.
|
|
660
717
|
|
|
661
|
-
[Unreleased]: https://github.com/pratik916/tracefork/compare/v0.
|
|
718
|
+
[Unreleased]: https://github.com/pratik916/tracefork/compare/v0.3.0...HEAD
|
|
719
|
+
[0.3.0]: https://github.com/pratik916/tracefork/compare/v0.2.2...v0.3.0
|
|
662
720
|
[0.2.2]: https://github.com/pratik916/tracefork/compare/v0.2.1...v0.2.2
|
|
663
721
|
[0.2.1]: https://github.com/pratik916/tracefork/compare/v0.2.0...v0.2.1
|
|
664
722
|
[0.2.0]: https://github.com/pratik916/tracefork/compare/v0.1.0...v0.2.0
|