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.
Files changed (261) hide show
  1. {tracefork-0.2.1 → tracefork-0.3.0}/.github/workflows/ci.yml +3 -1
  2. tracefork-0.3.0/.github/workflows/mutation.yml +46 -0
  3. {tracefork-0.2.1 → tracefork-0.3.0}/.github/workflows/release.yml +2 -2
  4. {tracefork-0.2.1 → tracefork-0.3.0}/.gitignore +3 -0
  5. tracefork-0.3.0/CHANGELOG.md +723 -0
  6. tracefork-0.3.0/CLAUDE.md +962 -0
  7. tracefork-0.3.0/PKG-INFO +306 -0
  8. tracefork-0.3.0/README.md +233 -0
  9. tracefork-0.3.0/docs/plugin-api.md +171 -0
  10. tracefork-0.3.0/docs/session-cross-tape-design-spike.md +149 -0
  11. tracefork-0.3.0/examples/plugin_example/README.md +35 -0
  12. tracefork-0.3.0/examples/plugin_example/plugin_example/__init__.py +3 -0
  13. tracefork-0.3.0/examples/plugin_example/plugin_example/matcher.py +67 -0
  14. tracefork-0.3.0/examples/plugin_example/pyproject.toml +24 -0
  15. {tracefork-0.2.1 → tracefork-0.3.0}/pyproject.toml +26 -1
  16. tracefork-0.3.0/scripts/check_executed_evidence.py +168 -0
  17. {tracefork-0.2.1 → tracefork-0.3.0}/scripts/e2e.sh +5 -2
  18. tracefork-0.3.0/scripts/mutation.sh +35 -0
  19. tracefork-0.3.0/scripts/mutation_summary.py +180 -0
  20. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/__init__.py +6 -0
  21. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/adapters/__init__.py +10 -3
  22. tracefork-0.3.0/src/tracefork/adapters/shepherd.py +267 -0
  23. tracefork-0.3.0/src/tracefork/archetypes.py +498 -0
  24. tracefork-0.3.0/src/tracefork/basis.py +122 -0
  25. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/bedrock_transport.py +3 -2
  26. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/bench.py +37 -4
  27. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/blame.py +420 -44
  28. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/boundary_guard.py +141 -1
  29. tracefork-0.3.0/src/tracefork/bundle.py +122 -0
  30. tracefork-0.3.0/src/tracefork/certificate.py +134 -0
  31. tracefork-0.3.0/src/tracefork/checkpoint.py +204 -0
  32. tracefork-0.3.0/src/tracefork/checkpoint_stream.py +98 -0
  33. tracefork-0.3.0/src/tracefork/ci_calibration.py +207 -0
  34. tracefork-0.3.0/src/tracefork/cli.py +2928 -0
  35. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/competing_faults.py +222 -1
  36. tracefork-0.3.0/src/tracefork/concurrent_validate.py +422 -0
  37. tracefork-0.3.0/src/tracefork/confinement_diagnostics.py +80 -0
  38. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/constants.py +27 -1
  39. tracefork-0.3.0/src/tracefork/convergence.py +137 -0
  40. tracefork-0.3.0/src/tracefork/corpus.py +229 -0
  41. tracefork-0.3.0/src/tracefork/cost_profile.py +157 -0
  42. tracefork-0.3.0/src/tracefork/coverage.py +227 -0
  43. tracefork-0.3.0/src/tracefork/cross_tape_blame.py +165 -0
  44. tracefork-0.3.0/src/tracefork/diff.py +169 -0
  45. tracefork-0.3.0/src/tracefork/effects.py +279 -0
  46. tracefork-0.3.0/src/tracefork/field_oracle.py +126 -0
  47. tracefork-0.3.0/src/tracefork/fork.py +730 -0
  48. tracefork-0.3.0/src/tracefork/fork_allowlist.py +110 -0
  49. tracefork-0.3.0/src/tracefork/fsck.py +116 -0
  50. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/interop.py +74 -10
  51. tracefork-0.3.0/src/tracefork/live.py +73 -0
  52. tracefork-0.3.0/src/tracefork/locate.py +130 -0
  53. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/matcher.py +11 -0
  54. tracefork-0.3.0/src/tracefork/narrative.py +105 -0
  55. tracefork-0.3.0/src/tracefork/nondet.py +227 -0
  56. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/providers/__init__.py +8 -0
  57. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/providers/anthropic.py +12 -2
  58. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/providers/base.py +61 -2
  59. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/providers/bedrock.py +36 -10
  60. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/providers/gemini.py +35 -13
  61. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/providers/openai.py +12 -2
  62. tracefork-0.3.0/src/tracefork/query.py +241 -0
  63. tracefork-0.3.0/src/tracefork/receipt.py +160 -0
  64. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/record_mode.py +18 -20
  65. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/recorder.py +105 -4
  66. tracefork-0.3.0/src/tracefork/release_receipt.py +276 -0
  67. tracefork-0.3.0/src/tracefork/repl.py +59 -0
  68. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/replay.py +45 -2
  69. tracefork-0.3.0/src/tracefork/report.py +247 -0
  70. tracefork-0.3.0/src/tracefork/report_session.py +114 -0
  71. tracefork-0.3.0/src/tracefork/selfaudit.py +136 -0
  72. tracefork-0.3.0/src/tracefork/server.py +287 -0
  73. tracefork-0.3.0/src/tracefork/session_chaos.py +114 -0
  74. tracefork-0.3.0/src/tracefork/session_cost.py +134 -0
  75. tracefork-0.3.0/src/tracefork/session_ops.py +137 -0
  76. tracefork-0.3.0/src/tracefork/session_replay.py +133 -0
  77. tracefork-0.3.0/src/tracefork/settlement.py +228 -0
  78. tracefork-0.3.0/src/tracefork/store.py +1403 -0
  79. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/tape.py +104 -14
  80. tracefork-0.3.0/src/tracefork/tapequery.py +101 -0
  81. tracefork-0.3.0/src/tracefork/tournament.py +397 -0
  82. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/transport.py +77 -5
  83. tracefork-0.3.0/tests/fixtures/fork_ui_agent.py +21 -0
  84. tracefork-0.3.0/tests/required_test_ids.txt +70 -0
  85. tracefork-0.3.0/tests/test_adapter_fork_blame_parity.py +167 -0
  86. tracefork-0.3.0/tests/test_adapters_shepherd.py +258 -0
  87. tracefork-0.3.0/tests/test_archetypes.py +159 -0
  88. tracefork-0.3.0/tests/test_basis.py +167 -0
  89. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_bench.py +11 -9
  90. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_blame.py +463 -0
  91. tracefork-0.3.0/tests/test_blame_heatmap.py +206 -0
  92. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_boundary_guard.py +91 -1
  93. tracefork-0.3.0/tests/test_branch_queries.py +282 -0
  94. tracefork-0.3.0/tests/test_bundle.py +205 -0
  95. tracefork-0.3.0/tests/test_causal_edges.py +235 -0
  96. tracefork-0.3.0/tests/test_certificate.py +175 -0
  97. tracefork-0.3.0/tests/test_check_executed_evidence.py +130 -0
  98. tracefork-0.3.0/tests/test_checkpoint.py +151 -0
  99. tracefork-0.3.0/tests/test_checkpoint_stream.py +179 -0
  100. tracefork-0.3.0/tests/test_ci_calibration.py +100 -0
  101. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_cli.py +32 -0
  102. tracefork-0.3.0/tests/test_cli_session_board.py +106 -0
  103. tracefork-0.3.0/tests/test_cli_smoke.py +947 -0
  104. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_competing_faults.py +58 -0
  105. tracefork-0.3.0/tests/test_concurrent_validate.py +107 -0
  106. tracefork-0.3.0/tests/test_confinement_diagnostics.py +206 -0
  107. tracefork-0.3.0/tests/test_confinement_risk.py +202 -0
  108. tracefork-0.3.0/tests/test_confinement_tier.py +333 -0
  109. tracefork-0.3.0/tests/test_convergence.py +197 -0
  110. tracefork-0.3.0/tests/test_corpus.py +304 -0
  111. tracefork-0.3.0/tests/test_cost_profile.py +179 -0
  112. tracefork-0.3.0/tests/test_coverage.py +132 -0
  113. tracefork-0.3.0/tests/test_cross_tape_blame.py +336 -0
  114. tracefork-0.3.0/tests/test_diff.py +206 -0
  115. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_e2e.py +5 -4
  116. tracefork-0.3.0/tests/test_effects.py +229 -0
  117. tracefork-0.3.0/tests/test_field_oracle.py +159 -0
  118. tracefork-0.3.0/tests/test_fork.py +664 -0
  119. tracefork-0.3.0/tests/test_fork_endpoint.py +206 -0
  120. tracefork-0.3.0/tests/test_fsck.py +107 -0
  121. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_interop.py +53 -0
  122. tracefork-0.3.0/tests/test_live.py +95 -0
  123. tracefork-0.3.0/tests/test_locate.py +325 -0
  124. tracefork-0.3.0/tests/test_mutation_summary.py +202 -0
  125. tracefork-0.3.0/tests/test_narrative.py +218 -0
  126. tracefork-0.3.0/tests/test_nondet_env.py +197 -0
  127. tracefork-0.3.0/tests/test_nondet_read_file.py +189 -0
  128. tracefork-0.3.0/tests/test_otel_locate.py +88 -0
  129. tracefork-0.3.0/tests/test_plugin_example.py +114 -0
  130. tracefork-0.3.0/tests/test_property_ci_nesting.py +131 -0
  131. tracefork-0.3.0/tests/test_property_matcher.py +63 -0
  132. tracefork-0.3.0/tests/test_property_tape.py +130 -0
  133. tracefork-0.3.0/tests/test_provider_capabilities.py +89 -0
  134. tracefork-0.3.0/tests/test_query.py +270 -0
  135. tracefork-0.3.0/tests/test_receipt.py +271 -0
  136. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_record_mode.py +11 -12
  137. tracefork-0.3.0/tests/test_release_receipt.py +332 -0
  138. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_replay.py +37 -1
  139. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_report.py +133 -1
  140. tracefork-0.3.0/tests/test_report_causal_forktree.py +193 -0
  141. tracefork-0.3.0/tests/test_report_scrubber.py +80 -0
  142. tracefork-0.3.0/tests/test_report_session.py +118 -0
  143. tracefork-0.3.0/tests/test_report_slice_vocabulary.py +189 -0
  144. tracefork-0.3.0/tests/test_runs_page.py +72 -0
  145. tracefork-0.3.0/tests/test_selfaudit.py +81 -0
  146. tracefork-0.3.0/tests/test_session_chaos.py +214 -0
  147. tracefork-0.3.0/tests/test_session_cost.py +207 -0
  148. tracefork-0.3.0/tests/test_session_replay.py +329 -0
  149. tracefork-0.3.0/tests/test_session_verbs.py +458 -0
  150. tracefork-0.3.0/tests/test_sessions.py +231 -0
  151. tracefork-0.3.0/tests/test_settlement.py +209 -0
  152. tracefork-0.3.0/tests/test_shapley_report_panel.py +138 -0
  153. tracefork-0.3.0/tests/test_storage.py +939 -0
  154. tracefork-0.3.0/tests/test_storage_multiprocess.py +97 -0
  155. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_tape.py +29 -0
  156. tracefork-0.3.0/tests/test_tapequery.py +161 -0
  157. tracefork-0.3.0/tests/test_tournament.py +244 -0
  158. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_transport.py +69 -0
  159. tracefork-0.3.0/tests/test_url_model_detection.py +302 -0
  160. {tracefork-0.2.1 → tracefork-0.3.0}/uv.lock +215 -2
  161. tracefork-0.3.0/web/report.html +817 -0
  162. tracefork-0.3.0/web/runs.html +84 -0
  163. tracefork-0.3.0/web/session_report.html +198 -0
  164. tracefork-0.2.1/CHANGELOG.md +0 -163
  165. tracefork-0.2.1/CLAUDE.md +0 -241
  166. tracefork-0.2.1/PKG-INFO +0 -636
  167. tracefork-0.2.1/README.md +0 -566
  168. tracefork-0.2.1/src/tracefork/cli.py +0 -766
  169. tracefork-0.2.1/src/tracefork/fork.py +0 -370
  170. tracefork-0.2.1/src/tracefork/nondet.py +0 -119
  171. tracefork-0.2.1/src/tracefork/report.py +0 -137
  172. tracefork-0.2.1/src/tracefork/server.py +0 -73
  173. tracefork-0.2.1/src/tracefork/store.py +0 -175
  174. tracefork-0.2.1/tests/test_cli_smoke.py +0 -360
  175. tracefork-0.2.1/tests/test_fork.py +0 -313
  176. tracefork-0.2.1/tests/test_storage.py +0 -248
  177. tracefork-0.2.1/web/report.html +0 -308
  178. {tracefork-0.2.1 → tracefork-0.3.0}/.editorconfig +0 -0
  179. {tracefork-0.2.1 → tracefork-0.3.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  180. {tracefork-0.2.1 → tracefork-0.3.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  181. {tracefork-0.2.1 → tracefork-0.3.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  182. {tracefork-0.2.1 → tracefork-0.3.0}/.github/dependabot.yml +0 -0
  183. {tracefork-0.2.1 → tracefork-0.3.0}/.github/pull_request_template.md +0 -0
  184. {tracefork-0.2.1 → tracefork-0.3.0}/.pre-commit-config.yaml +0 -0
  185. {tracefork-0.2.1 → tracefork-0.3.0}/CODE_OF_CONDUCT.md +0 -0
  186. {tracefork-0.2.1 → tracefork-0.3.0}/CONTRIBUTING.md +0 -0
  187. {tracefork-0.2.1 → tracefork-0.3.0}/LICENSE +0 -0
  188. {tracefork-0.2.1 → tracefork-0.3.0}/SECURITY.md +0 -0
  189. {tracefork-0.2.1 → tracefork-0.3.0}/SPIKE0.md +0 -0
  190. {tracefork-0.2.1 → tracefork-0.3.0}/docs/demo.png +0 -0
  191. {tracefork-0.2.1 → tracefork-0.3.0}/docs/packaging-decisions.md +0 -0
  192. {tracefork-0.2.1 → tracefork-0.3.0}/examples/demo_report.py +0 -0
  193. {tracefork-0.2.1 → tracefork-0.3.0}/experiments/replay_fixtures/manifest.json +0 -0
  194. {tracefork-0.2.1 → tracefork-0.3.0}/experiments/replay_fixtures/single_turn.tape.sqlite +0 -0
  195. {tracefork-0.2.1 → tracefork-0.3.0}/experiments/replay_fixtures/two_turn.tape.sqlite +0 -0
  196. {tracefork-0.2.1 → tracefork-0.3.0}/experiments/validation_report_committed.json +0 -0
  197. {tracefork-0.2.1 → tracefork-0.3.0}/scripts/gen_replay_fixtures.py +0 -0
  198. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/adapters/adk.py +0 -0
  199. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/adapters/autogen.py +0 -0
  200. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/adapters/base.py +0 -0
  201. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/adapters/crewai.py +0 -0
  202. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/adapters/langchain.py +0 -0
  203. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/adapters/openai_agents.py +0 -0
  204. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/config.py +0 -0
  205. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/data/pricing.json +0 -0
  206. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/divergence.py +0 -0
  207. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/eventstream.py +0 -0
  208. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/faults.py +0 -0
  209. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/fixtures.py +0 -0
  210. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/judge.py +0 -0
  211. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/mcp_client.py +0 -0
  212. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/observability.py +0 -0
  213. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/plugins.py +0 -0
  214. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/pricing.py +0 -0
  215. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/proxy.py +0 -0
  216. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/py.typed +0 -0
  217. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/redact.py +0 -0
  218. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/synthetic.py +0 -0
  219. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/tools.py +0 -0
  220. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/validate.py +0 -0
  221. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork/wire.py +0 -0
  222. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork_spike/__init__.py +0 -0
  223. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork_spike/__main__.py +0 -0
  224. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork_spike/agent.py +0 -0
  225. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork_spike/fake_llm.py +0 -0
  226. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork_spike/nondet.py +0 -0
  227. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork_spike/spike.py +0 -0
  228. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork_spike/tape.py +0 -0
  229. {tracefork-0.2.1 → tracefork-0.3.0}/src/tracefork_spike/transport.py +0 -0
  230. {tracefork-0.2.1 → tracefork-0.3.0}/tests/__init__.py +0 -0
  231. {tracefork-0.2.1 → tracefork-0.3.0}/tests/fakes.py +0 -0
  232. {tracefork-0.2.1 → tracefork-0.3.0}/tests/fixtures/legacy_tape_v1.blob +0 -0
  233. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_adapters_adk.py +0 -0
  234. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_adapters_autogen.py +0 -0
  235. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_adapters_base.py +0 -0
  236. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_adapters_crewai.py +0 -0
  237. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_adapters_langchain.py +0 -0
  238. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_adapters_openai_agents.py +0 -0
  239. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_bedrock_eventstream.py +0 -0
  240. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_bedrock_provider.py +0 -0
  241. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_bedrock_transport.py +0 -0
  242. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_concurrency.py +0 -0
  243. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_config.py +0 -0
  244. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_divergence.py +0 -0
  245. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_faults.py +0 -0
  246. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_gemini_provider.py +0 -0
  247. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_judge.py +0 -0
  248. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_matcher.py +0 -0
  249. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_mcp_client.py +0 -0
  250. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_nondet.py +0 -0
  251. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_observability.py +0 -0
  252. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_openai_provider.py +0 -0
  253. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_plugins.py +0 -0
  254. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_pricing.py +0 -0
  255. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_provider_faults.py +0 -0
  256. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_providers.py +0 -0
  257. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_proxy.py +0 -0
  258. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_recorder.py +0 -0
  259. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_redact.py +0 -0
  260. {tracefork-0.2.1 → tracefork-0.3.0}/tests/test_spike0.py +0 -0
  261. {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@v4
23
+ - uses: actions/checkout@v7
24
24
  - name: Install uv
25
- uses: astral-sh/setup-uv@v3
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