consequa-x 2.1.0__tar.gz → 2.1.2__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 (233) hide show
  1. {consequa_x-2.1.0 → consequa_x-2.1.2}/CHANGELOG.md +39 -4
  2. {consequa_x-2.1.0 → consequa_x-2.1.2}/CONTRIBUTING.md +2 -2
  3. {consequa_x-2.1.0 → consequa_x-2.1.2}/PKG-INFO +9 -6
  4. {consequa_x-2.1.0 → consequa_x-2.1.2}/README.md +5 -5
  5. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/application-integration.md +1 -1
  6. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/design-2.0.md +1 -1
  7. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/framework-integration.md +8 -1
  8. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/migrating-to-2.0.md +1 -1
  9. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/offline-reports.md +1 -1
  10. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/opentelemetry.md +3 -3
  11. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/product-roadmap.md +4 -2
  12. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/quickstart.md +4 -4
  13. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/release-notes.md +37 -1
  14. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/stable-api.md +1 -1
  15. consequa_x-2.1.2/docs/v2-migration-conformance.md +220 -0
  16. {consequa_x-2.1.0 → consequa_x-2.1.2}/examples/agent_loop_sqlite.py +3 -3
  17. consequa_x-2.1.2/examples/two_part_outcome.py +216 -0
  18. {consequa_x-2.1.0 → consequa_x-2.1.2}/pyproject.toml +4 -1
  19. consequa_x-2.1.2/scripts/audit_external_validation_artifacts.py +458 -0
  20. consequa_x-2.1.2/scripts/audit_upstream_car_artifacts.py +616 -0
  21. consequa_x-2.1.2/scripts/audit_v2_migration_conformance.py +510 -0
  22. consequa_x-2.1.2/scripts/build_blinded_trace_review.py +401 -0
  23. {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/build_public_docs.py +11 -11
  24. {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/build_site_demo.py +92 -21
  25. {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/check_installed_release.py +1 -1
  26. consequa_x-2.1.2/scripts/check_live_integrations.py +298 -0
  27. {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/export_render_site.py +1 -1
  28. consequa_x-2.1.2/scripts/plot_external_validation.py +181 -0
  29. consequa_x-2.1.2/scripts/plot_upstream_car_validation.py +440 -0
  30. {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/publish_release.py +2 -2
  31. consequa_x-2.1.2/scripts/run_v2_migration_conformance.py +754 -0
  32. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/__init__.py +1 -1
  33. consequa_x-2.1.2/src/consequa_x/benchmark/__init__.py +1 -0
  34. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/cli.py +3 -2
  35. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/errors.py +2 -2
  36. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/explanation.py +2 -5
  37. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/integrations/claude_agent_sdk.py +1 -1
  38. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/integrations/langchain.py +2 -1
  39. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/integrations/openai_agents.py +2 -1
  40. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/migrate.py +1 -1
  41. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/otel.py +3 -3
  42. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/report.py +3 -3
  43. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/research.py +1 -1
  44. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/schema.py +1 -1
  45. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/schemas/trace-v1.0.json +1 -1
  46. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x.egg-info/PKG-INFO +9 -6
  47. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x.egg-info/SOURCES.txt +14 -0
  48. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_cli.py +11 -0
  49. consequa_x-2.1.2/tests/test_external_validation_artifact_audit.py +363 -0
  50. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_integration.py +3 -3
  51. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_policy_runner.py +1 -1
  52. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_public_integration.py +1 -1
  53. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_site_demo.py +10 -0
  54. consequa_x-2.1.2/tests/test_snapshot_integrity.py +178 -0
  55. consequa_x-2.1.2/tests/test_two_part_example.py +77 -0
  56. consequa_x-2.1.2/tests/test_v2_migration_artifact_audit.py +433 -0
  57. consequa_x-2.1.2/tests/test_v2_migration_conformance.py +323 -0
  58. consequa_x-2.1.0/src/consequa_x/benchmark/__init__.py +0 -1
  59. consequa_x-2.1.0/tests/test_snapshot_integrity.py +0 -60
  60. {consequa_x-2.1.0 → consequa_x-2.1.2}/LICENSE +0 -0
  61. {consequa_x-2.1.0 → consequa_x-2.1.2}/MANIFEST.in +0 -0
  62. {consequa_x-2.1.0 → consequa_x-2.1.2}/SECURITY.md +0 -0
  63. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/attribution-calibration.md +0 -0
  64. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/build-contract.md +0 -0
  65. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/car-reproduction-plan.md +0 -0
  66. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/completion-plan.md +0 -0
  67. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/decision-contrastive.md +0 -0
  68. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/decision-replay.md +0 -0
  69. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/decision-shapley.md +0 -0
  70. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/design.md +0 -0
  71. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/graph-witnesses.md +0 -0
  72. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/interaction-sampling.md +0 -0
  73. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/interval-followup-plan.md +0 -0
  74. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/launch-readiness.md +0 -0
  75. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/local-pypi-setup.md +0 -0
  76. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/matched-trace-judge.md +0 -0
  77. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/policy-evaluation.md +0 -0
  78. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/policy-replay.md +0 -0
  79. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/refund-interactions.md +0 -0
  80. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/release-readiness.md +0 -0
  81. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/research-roadmap.md +0 -0
  82. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/studies/matched-local-2026-10-18.json +0 -0
  83. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/studies/refund-family-candidates-v1.json +0 -0
  84. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/study-manifests.md +0 -0
  85. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/study-plan.md +0 -0
  86. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/tau-benchmark-validation.md +0 -0
  87. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/upstream-car-comparison.md +0 -0
  88. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/v1.1-release.md +0 -0
  89. {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/variable-length-game-plan.md +0 -0
  90. {consequa_x-2.1.0 → consequa_x-2.1.2}/examples/artifact_delivery.py +0 -0
  91. {consequa_x-2.1.0 → consequa_x-2.1.2}/examples/decision_shapley_fixture.py +0 -0
  92. {consequa_x-2.1.0 → consequa_x-2.1.2}/examples/report_quickstart.py +0 -0
  93. {consequa_x-2.1.0 → consequa_x-2.1.2}/requirements-dev.lock +0 -0
  94. {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/analyze_matched_local_study.py +0 -0
  95. {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/audit_interaction_sampling.py +0 -0
  96. {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/audit_interval_comparison.py +0 -0
  97. {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/audit_refund_interactions.py +0 -0
  98. {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/audit_release_artifacts.py +0 -0
  99. {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/audit_review_revision.py +0 -0
  100. {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/build_matched_study_figures.py +0 -0
  101. {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/configure_pypi_auth.py +0 -0
  102. {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/draw_paper_diagrams.py +0 -0
  103. {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/finalize_interval_artifacts.py +0 -0
  104. {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/finalize_matched_local_study.py +0 -0
  105. {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/finalize_refund_artifacts.py +0 -0
  106. {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/plot_interval_comparison.py +0 -0
  107. {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/plot_paper_results.py +0 -0
  108. {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/publish_alpha.py +0 -0
  109. {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/refresh_sample_report.py +0 -0
  110. {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/run_interaction_sampling.py +0 -0
  111. {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/run_matched_local_study.py +0 -0
  112. {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/run_matched_trace_judge.py +0 -0
  113. {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/run_tau_benchmark_validation.py +0 -0
  114. {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/run_upstream_car_study.py +0 -0
  115. {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/summarize_interaction_sampling.py +0 -0
  116. {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/summarize_matched_execution.py +0 -0
  117. {consequa_x-2.1.0 → consequa_x-2.1.2}/setup.cfg +0 -0
  118. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/__main__.py +0 -0
  119. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/adapters/__init__.py +0 -0
  120. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/adapters/ollama.py +0 -0
  121. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/attribution.py +0 -0
  122. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/assessment_metrics.py +0 -0
  123. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/calibration.py +0 -0
  124. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/calibration_export.py +0 -0
  125. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/calibration_mechanisms.py +0 -0
  126. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/decision_coalition.py +0 -0
  127. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/decision_contrastive.py +0 -0
  128. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/decision_replay.py +0 -0
  129. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/decision_shapley.py +0 -0
  130. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/evaluation.py +0 -0
  131. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/interaction_export.py +0 -0
  132. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/interaction_mechanisms.py +0 -0
  133. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/interaction_sampling.py +0 -0
  134. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/interval_comparison.py +0 -0
  135. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/intervals.py +0 -0
  136. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/payments.py +0 -0
  137. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/policy_experiment.py +0 -0
  138. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/policy_runner.py +0 -0
  139. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/runner.py +0 -0
  140. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/study.py +0 -0
  141. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/targets.py +0 -0
  142. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/templates.py +0 -0
  143. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/capture.py +0 -0
  144. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/compare.py +0 -0
  145. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/composite.py +0 -0
  146. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/graph.py +0 -0
  147. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/guard.py +0 -0
  148. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/integrations/__init__.py +0 -0
  149. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/mcp_capture.py +0 -0
  150. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/models.py +0 -0
  151. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/policies.py +0 -0
  152. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/py.typed +0 -0
  153. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/readback.py +0 -0
  154. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/record_verifier.py +0 -0
  155. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/store.py +0 -0
  156. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/summary.py +0 -0
  157. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/verification.py +0 -0
  158. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x.egg-info/dependency_links.txt +0 -0
  159. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x.egg-info/entry_points.txt +0 -0
  160. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x.egg-info/requires.txt +0 -0
  161. {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x.egg-info/top_level.txt +0 -0
  162. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/fixtures/v0.1/README.md +0 -0
  163. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/fixtures/v0.1/record-timeout-after-commit.json +0 -0
  164. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/fixtures/v0.1/refund-another-actor.json +0 -0
  165. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/fixtures/v0.1/refund-stale-readback.json +0 -0
  166. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/fixtures/v0.1/refund-timeout-after-commit.explanation.json +0 -0
  167. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/fixtures/v0.1/refund-timeout-after-commit.json +0 -0
  168. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_agent_loop_example.py +0 -0
  169. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_assessment_metrics.py +0 -0
  170. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_async_capture.py +0 -0
  171. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_attribution.py +0 -0
  172. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_calibration.py +0 -0
  173. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_calibration_cli.py +0 -0
  174. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_calibration_mechanisms.py +0 -0
  175. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_capture.py +0 -0
  176. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_compare_verify_redact.py +0 -0
  177. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_composite.py +0 -0
  178. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_decision_coalition.py +0 -0
  179. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_decision_contrastive.py +0 -0
  180. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_decision_contrastive_cli.py +0 -0
  181. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_decision_replay.py +0 -0
  182. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_decision_shapley.py +0 -0
  183. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_decision_shapley_cli.py +0 -0
  184. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_docs_examples.py +0 -0
  185. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_errors.py +0 -0
  186. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_graph.py +0 -0
  187. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_graph_identity.py +0 -0
  188. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_installed_release_check.py +0 -0
  189. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_integrations.py +0 -0
  190. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_interaction_sampling.py +0 -0
  191. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_interaction_sampling_cli.py +0 -0
  192. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_interaction_workers.py +0 -0
  193. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_interval_comparison.py +0 -0
  194. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_interval_replay.py +0 -0
  195. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_intervals.py +0 -0
  196. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_matched_baseline_audit.py +0 -0
  197. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_matched_execution_summary.py +0 -0
  198. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_matched_figure_builder.py +0 -0
  199. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_matched_local_study.py +0 -0
  200. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_matched_study_finalizer.py +0 -0
  201. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_matched_trace_judge.py +0 -0
  202. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_mcp_capture.py +0 -0
  203. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_migrate.py +0 -0
  204. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_model_eval_integration.py +0 -0
  205. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_models.py +0 -0
  206. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_multi_action.py +0 -0
  207. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_ollama.py +0 -0
  208. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_otel.py +0 -0
  209. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_payments.py +0 -0
  210. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_policies.py +0 -0
  211. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_policy_evaluation.py +0 -0
  212. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_policy_experiment.py +0 -0
  213. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_policy_experiment_integration.py +0 -0
  214. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_prompt_profile_cli.py +0 -0
  215. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_readback_guard.py +0 -0
  216. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_record_verifier.py +0 -0
  217. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_refund_interactions.py +0 -0
  218. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_refund_interactions_cli.py +0 -0
  219. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_release_helpers.py +0 -0
  220. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_release_inventory.py +0 -0
  221. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_render_site_export.py +0 -0
  222. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_replay_targets.py +0 -0
  223. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_report.py +0 -0
  224. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_report_cli.py +0 -0
  225. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_research_integration.py +0 -0
  226. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_schema.py +0 -0
  227. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_stable_release.py +0 -0
  228. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_study.py +0 -0
  229. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_summary_store.py +0 -0
  230. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_task_templates.py +0 -0
  231. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_tau_benchmark_validation.py +0 -0
  232. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_upstream_car_study.py +0 -0
  233. {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_verification.py +0 -0
@@ -1,12 +1,45 @@
1
1
  # Changes
2
2
 
3
+ ## 2.1.2 - 20 October 2026
4
+
5
+ A maintenance release; the API, exported records and trace schema are
6
+ unchanged.
7
+
8
+ - `ActionExplanation.diagnosis`, the one-line display label, is always the
9
+ diagnosis codes joined with ` / `. A timeout after commit no longer shows the
10
+ 1.x label `BELIEF / RESPONSE DIVERGENCE`: `consequa-x demo` and its README now
11
+ print `ASSESSMENT_DIVERGENCE / ACKNOWLEDGEMENT_EFFECT_DIVERGENCE`, the codes
12
+ that explanations and reports already carried.
13
+
14
+ ## 2.1.1 - 19 October 2026
15
+
16
+ A maintenance release; the API and trace schema are unchanged. Published to
17
+ PyPI with registry hashes verified; see the
18
+ [release record](output/release-2.1.1-2026-10-19/README.md). Installed checks
19
+ passed on Windows Python 3.11 to 3.15, on one Alpine Linux QEMU guest with
20
+ Python 3.14 and from a fresh PyPI install. macOS has never been tested.
21
+
22
+ - The project's name is written ConseqaX: README, documentation, report title
23
+ and footer, the trace schema's title and command-line text. The package,
24
+ command and import names stay `consequa-x` and `consequa_x`.
25
+ - Python 3.13, 3.14 and 3.15 are tested and declared (PyPI classifiers and
26
+ documentation), alongside 3.11 and 3.12.
27
+ - Each framework integration was also run with a real model in a real agent
28
+ loop (`scripts/check_live_integrations.py`); the recorded attempts matched
29
+ the tool calls that ran.
30
+ - New example `examples/two_part_outcome.py`: an `all_of` contract over a refund
31
+ and a ticket closure, read back from two SQLite files.
32
+
3
33
  ## 2.1.0 - 19 October 2026
4
34
 
5
35
  Additive: the roadmap features left out of 2.0.0 (verifier composition,
6
36
  framework integrations and OpenTelemetry). Schema `1.0` and the 2.0 API are
7
- unchanged, and the core still has no required runtime dependency. Checked
8
- before publication; see the
9
- [release record](output/release-2.1.0-2026-10-19/README.md).
37
+ unchanged, and the core still has no required runtime dependency. Published
38
+ to PyPI with registry hashes verified; see the
39
+ [release record](output/release-2.1.0-2026-10-19/README.md). Installed checks
40
+ passed on Windows Python 3.11.9 and 3.12.10, on one Alpine Linux 3.24.2 QEMU
41
+ guest with Python 3.14.8 and from a fresh PyPI install; the integrations passed against the installed wheel
42
+ with each SDK present. macOS has never been tested.
10
43
 
11
44
  - Verifier composition. `all_of(contract_id, *parts)` and `any_of(...)` build
12
45
  one outcome contract from part contracts, each with its own predicate,
@@ -50,6 +83,8 @@ before publication; see the
50
83
  `PostToolUseFailure`). Tested offline with openai-agents 0.24.0,
51
84
  langchain-core 1.6.12, claude-agent-sdk 0.2.168 and opentelemetry 1.45.1; no
52
85
  live model was called.
86
+ - Report tables scroll inside their frame on narrow screens; their cells no
87
+ longer collapse to one character per line (present since 2.0).
53
88
 
54
89
  ## 2.0.0 - 19 October 2026 (breaking)
55
90
 
@@ -264,7 +299,7 @@ preselected complete traces. The
264
299
  [derived findings](output/interaction-sampling-findings-2026-10-15/FINDINGS.md)
265
300
  retain coverage, width, detection and refusal denominators. The defined
266
301
  framework and protocol/software paper scope is complete on 16 October 2026:
267
- the [illustrated eight-page IEEE PDF](output/pdf/Consequa-X_IEEE_Paper.pdf) compiled and all
302
+ the [illustrated eight-page IEEE PDF](output/pdf/ConseqaX_IEEE_Paper.pdf) compiled and all
268
303
  rendered pages passed visual review. The [QA receipt](output/pdf/qa.json) binds
269
304
  it to the frozen [editable source](paper/consequa-x-ieee.tex) and four vector
270
305
  figures. Actual venue selection, final human
@@ -1,4 +1,4 @@
1
- # Contributing to Consequa-X
1
+ # Contributing to ConseqaX
2
2
 
3
3
  Thanks for helping. This public repository holds the Python package, its tests
4
4
  and documentation, the website, and the research records behind the paper. The
@@ -23,7 +23,7 @@ to a pull request. Report vulnerabilities privately as described in
23
23
 
24
24
  ## Set up a development environment
25
25
 
26
- Fork and clone the repository, then create a branch for your change. Use Python 3.11 or 3.12:
26
+ Fork and clone the repository, then create a branch for your change. Use Python 3.11 or newer:
27
27
 
28
28
  ```sh
29
29
  python -m venv .venv
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: consequa-x
3
- Version: 2.1.0
3
+ Version: 2.1.2
4
4
  Summary: Evidence-aware explanation of consequential agent actions
5
5
  Author: Devrajsinh Jhala
6
6
  License-Expression: MIT
@@ -14,6 +14,9 @@ Classifier: Development Status :: 5 - Production/Stable
14
14
  Classifier: Programming Language :: Python :: 3 :: Only
15
15
  Classifier: Programming Language :: Python :: 3.11
16
16
  Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Programming Language :: Python :: 3.14
19
+ Classifier: Programming Language :: Python :: 3.15
17
20
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
18
21
  Requires-Python: >=3.11
19
22
  Description-Content-Type: text/markdown
@@ -33,7 +36,7 @@ Provides-Extra: otel
33
36
  Requires-Dist: opentelemetry-api>=1.45; extra == "otel"
34
37
  Dynamic: license-file
35
38
 
36
- # Consequa-X
39
+ # ConseqaX
37
40
 
38
41
  **Evidence-aware explanation of consequential agent actions.**
39
42
 
@@ -42,7 +45,7 @@ database write), the tool's response is only part of the story. A timeout can
42
45
  hide a refund that went through. A "success" can hide one that never landed.
43
46
  Another actor can produce the very outcome the agent was asked for.
44
47
 
45
- Consequa-X keeps four things apart: the **tool response**, what the **agent
48
+ ConseqaX keeps four things apart: the **tool response**, what the **agent
46
49
  reported**, the outcome established by an **independent read-only readback**, and
47
50
  **who produced the effect**. Missing, stale or incomplete evidence stays
48
51
  `unknown` instead of being guessed.
@@ -166,7 +169,7 @@ receipt = verify(action, observation, verifier=MyVerifier())
166
169
  ```
167
170
 
168
171
  Your application owns source trust, scope, completeness, timing and provenance;
169
- Consequa-X checks that receipts bind to the supplied action, contract and
172
+ ConseqaX checks that receipts bind to the supplied action, contract and
170
173
  observation, and keeps the evidence structured. The
171
174
  [artifact-delivery example](https://github.com/Devrajsinh-Jhala/consequa-x/blob/main/examples/artifact_delivery.py)
172
175
  implements a verifier with public APIs only, and the
@@ -252,8 +255,8 @@ and the [paper notes](https://github.com/Devrajsinh-Jhala/consequa-x/blob/main/p
252
255
  ## Platforms
253
256
 
254
257
  The package is pure Python. Released wheels have been install-tested on Windows
255
- with Python 3.11 and 3.12 and on one Alpine Linux virtual machine with Python
256
- 3.14. macOS has not been tested yet. See the
258
+ with Python 3.11, 3.12, 3.13, 3.14 and 3.15, and on one Alpine Linux virtual
259
+ machine with Python 3.14. macOS has not been tested yet. See the
257
260
  [release notes](https://consequa-x.onrender.com/changelog.html) for exact
258
261
  environments.
259
262
 
@@ -1,4 +1,4 @@
1
- # Consequa-X
1
+ # ConseqaX
2
2
 
3
3
  **Evidence-aware explanation of consequential agent actions.**
4
4
 
@@ -7,7 +7,7 @@ database write), the tool's response is only part of the story. A timeout can
7
7
  hide a refund that went through. A "success" can hide one that never landed.
8
8
  Another actor can produce the very outcome the agent was asked for.
9
9
 
10
- Consequa-X keeps four things apart: the **tool response**, what the **agent
10
+ ConseqaX keeps four things apart: the **tool response**, what the **agent
11
11
  reported**, the outcome established by an **independent read-only readback**, and
12
12
  **who produced the effect**. Missing, stale or incomplete evidence stays
13
13
  `unknown` instead of being guessed.
@@ -131,7 +131,7 @@ receipt = verify(action, observation, verifier=MyVerifier())
131
131
  ```
132
132
 
133
133
  Your application owns source trust, scope, completeness, timing and provenance;
134
- Consequa-X checks that receipts bind to the supplied action, contract and
134
+ ConseqaX checks that receipts bind to the supplied action, contract and
135
135
  observation, and keeps the evidence structured. The
136
136
  [artifact-delivery example](https://github.com/Devrajsinh-Jhala/consequa-x/blob/main/examples/artifact_delivery.py)
137
137
  implements a verifier with public APIs only, and the
@@ -217,8 +217,8 @@ and the [paper notes](https://github.com/Devrajsinh-Jhala/consequa-x/blob/main/p
217
217
  ## Platforms
218
218
 
219
219
  The package is pure Python. Released wheels have been install-tested on Windows
220
- with Python 3.11 and 3.12 and on one Alpine Linux virtual machine with Python
221
- 3.14. macOS has not been tested yet. See the
220
+ with Python 3.11, 3.12, 3.13, 3.14 and 3.15, and on one Alpine Linux virtual
221
+ machine with Python 3.14. macOS has not been tested yet. See the
222
222
  [release notes](https://consequa-x.onrender.com/changelog.html) for exact
223
223
  environments.
224
224
 
@@ -1,6 +1,6 @@
1
1
  # Integrating an application
2
2
 
3
- Consequa-X explains captured application actions without using the refund
3
+ ConseqaX explains captured application actions without using the refund
4
4
  simulator, calling a model, or executing a write. Register each action's target
5
5
  before running it, keep its responses and the agent's reported assessments, then
6
6
  obtain a separate readback observation. A response is evidence about the request;
@@ -1,4 +1,4 @@
1
- # Consequa-X 2.0 design
1
+ # ConseqaX 2.0 design
2
2
 
3
3
  Status: released as 2.0.0 on 19 October 2026 (steps 1 to 6 below, except
4
4
  verifier composition). Verifier composition and step 7 were released in 2.1.0. Decided 19 October 2026, after
@@ -121,7 +121,14 @@ refund happened; readback does.
121
121
  Tested with openai-agents 0.24.0, langchain-core 1.6.12 and claude-agent-sdk
122
122
  0.2.168. The tests drive each SDK offline: the Agents SDK's `ScriptedModel` in a
123
123
  real `Runner` loop, real LangChain tools with callbacks, and the Claude Agent
124
- SDK's hook protocol through a scripted transport. No live model was called.
124
+ SDK's hook protocol through a scripted transport. Each integration was also run
125
+ once with a real model in a real agent loop
126
+ ([`scripts/check_live_integrations.py`](../scripts/check_live_integrations.py)):
127
+ the OpenAI Agents SDK and LangChain with a local 4B Qwen model served by Ollama,
128
+ the Claude Agent SDK with Claude Haiku. In each run the refund tool timed out
129
+ after committing, the recorded attempts matched the calls that ran, and readback
130
+ showed the refund the agent had reported as failed. One run per framework shows
131
+ the wiring works; it does not cover every model or SDK release.
125
132
 
126
133
  ## Doing it by hand
127
134
 
@@ -1,4 +1,4 @@
1
- # Migrating to Consequa-X 2.0
1
+ # Migrating to ConseqaX 2.0
2
2
 
3
3
  2.0 makes the breaking changes planned in the [2.0 design](design-2.0.md) once.
4
4
  Evidence discipline is unchanged: tool response, the agent's report, verified
@@ -1,6 +1,6 @@
1
1
  # Offline visual reports
2
2
 
3
- Consequa-X renders a dependency-free HTML report for a captured, validated
3
+ ConseqaX renders a dependency-free HTML report for a captured, validated
4
4
  trace:
5
5
 
6
6
  ```console
@@ -1,6 +1,6 @@
1
1
  # OpenTelemetry export and import
2
2
 
3
- `consequa_x.otel` (added in 2.1) moves Consequa-X traces through an
3
+ `consequa_x.otel` (added in 2.1) moves ConseqaX traces through an
4
4
  OpenTelemetry pipeline, next to the rest of an agent's telemetry, and reads
5
5
  tool spans from other instrumentation back into a recorder. The OTLP/JSON
6
6
  functions need no dependency; `emit` needs `opentelemetry-api`
@@ -9,7 +9,7 @@ functions need no dependency; `emit` needs `opentelemetry-api`
9
9
  Tool spans follow the OpenTelemetry GenAI semantic conventions for
10
10
  `execute_tool` spans. Those conventions are still in *development* status
11
11
  upstream, so attribute names may change in later OpenTelemetry releases. Every
12
- Consequa-X finding uses its own `consequa_x.*` attributes.
12
+ ConseqaX finding uses its own `consequa_x.*` attributes.
13
13
 
14
14
  ## What an export contains
15
15
 
@@ -77,7 +77,7 @@ command line:
77
77
  consequa-x otel-import spans.json --output-dir restored
78
78
  ```
79
79
 
80
- Spans written by other instrumentation hold no Consequa-X trace, but their tool
80
+ Spans written by other instrumentation hold no ConseqaX trace, but their tool
81
81
  spans can still start one. `record_tool_spans` reads `execute_tool` spans into
82
82
  a `TraceRecorder` (which must use the default `unix_ms` time base). You decide
83
83
  which calls are consequential and what their outcome contract is:
@@ -1,7 +1,7 @@
1
1
  # Product roadmap
2
2
 
3
3
  Agreed 18 October 2026, after publishing 1.1.1. This page tracks package
4
- features for users of Consequa-X; the research agenda stays in the
4
+ features for users of ConseqaX; the research agenda stays in the
5
5
  [research roadmap](research-roadmap.md). Update the status column as work lands.
6
6
 
7
7
  ## Decision
@@ -113,7 +113,9 @@ or new research interfaces in the core package.
113
113
  during the 2.0 build, contrary to the maintainer's instruction to include every
114
114
  feature in the breaking release; the maintainer then asked for them to be built
115
115
  and released. They are additive, so they ship as 2.1.0 without another breaking
116
- change. With them, every feature in this roadmap is released.
116
+ change. Released as 2.1.0 on 19 October 2026; see the
117
+ [release record](../output/release-2.1.0-2026-10-19/README.md). With them, every
118
+ feature in this roadmap is released.
117
119
 
118
120
  | ID | Feature | Status |
119
121
  | --- | --- | --- |
@@ -1,10 +1,10 @@
1
1
  # Five-minute offline quickstart
2
2
 
3
- Use Python 3.11 or 3.12. No model, API key, provider account or runtime dependency
4
- is required. Version 2.1.0 is public on PyPI. Traces use schema 1.0.
3
+ Use Python 3.11 or newer. No model, API key, provider account or runtime dependency
4
+ is required. Version 2.1.2 is public on PyPI. Traces use schema 1.0.
5
5
 
6
6
  ```console
7
- python -m pip install consequa-x==2.1.0
7
+ python -m pip install consequa-x==2.1.2
8
8
  consequa-x --version
9
9
  ```
10
10
 
@@ -89,7 +89,7 @@ The schema validates structure and identity linkage. Source authentication,
89
89
  transaction guarantees and the truth of adapter-provided metadata remain your
90
90
  application's responsibility. Unknown evidence must stay unknown.
91
91
 
92
- Traces use schema 1.0. Convert traces saved by Consequa-X 1.x with
92
+ Traces use schema 1.0. Convert traces saved by ConseqaX 1.x with
93
93
  consequa-x migrate OLD.json --output NEW.json. Research replay
94
94
  interfaces have separate assumptions; no baseline superiority or live-model
95
95
  accuracy improvement is claimed. Platform validation is listed in release notes
@@ -1,5 +1,31 @@
1
1
  # Release notes
2
2
 
3
+ ## 2.1.2 — 20 October 2026
4
+
5
+ - The demo's timeout-after-commit case now prints its diagnosis codes,
6
+ ASSESSMENT_DIVERGENCE and ACKNOWLEDGEMENT_EFFECT_DIVERGENCE, instead of an
7
+ old label from version 1. Reports and saved explanations already showed these
8
+ codes.
9
+ - Nothing else changed: saved traces, explanations and code written for 2.1
10
+ work as before.
11
+
12
+ ## 2.1.1 — 19 October 2026
13
+
14
+ - The project is now written ConseqaX. You still install it with
15
+ pip install consequa-x and import consequa_x.
16
+ - Tested on Python 3.13, 3.14 and 3.15 as well as 3.11 and 3.12.
17
+ - Each framework integration was run once with a real model: the OpenAI Agents
18
+ SDK and LangChain with a local model through Ollama, the Claude Agent SDK
19
+ with Claude Haiku. The recorded tool calls matched what actually ran.
20
+ - A new example, two_part_outcome.py, checks a refund and a ticket closure
21
+ as one outcome.
22
+
23
+ Both files are published on PyPI with their registry hashes and sizes verified,
24
+ and a fresh install from PyPI passed the installed checks. Installed checks of
25
+ the same wheel passed on Windows with Python 3.11.9, 3.12.10, 3.13.16, 3.14.8
26
+ and 3.15.0, and on Alpine Linux 3.24.2 with Python 3.14.8 in a local QEMU guest.
27
+ The Linux result covers one emulated guest; macOS has not been tested.
28
+
3
29
  ## 2.1.0 — 19 October 2026
4
30
 
5
31
  An additive release with the features 2.0.0 left out. Saved traces and code
@@ -18,7 +44,17 @@ written for 2.0 work unchanged.
18
44
 
19
45
  The integrations were tested offline against openai-agents 0.24.0,
20
46
  langchain-core 1.6.12, claude-agent-sdk 0.2.168 and opentelemetry 1.45.1,
21
- without a live model or tracing backend.
47
+ without a live model or tracing backend. Report tables now scroll on narrow
48
+ screens instead of squeezing their cells.
49
+
50
+ Both files are published on PyPI with their registry hashes and sizes verified,
51
+ and a fresh install from PyPI passed the installed checks. The source suite
52
+ passed 1,921 tests plus 241 subtests. Installed checks of the same wheel passed on Windows with embedded Python 3.11.9 and Python 3.12.10, and
53
+ on Alpine Linux 3.24.2 with Python 3.14.8 in a local QEMU guest. The integration,
54
+ OpenTelemetry and composite tests passed against the installed wheel with each
55
+ SDK present. The source distribution installed on Windows Python 3.12.10 and
56
+ ran the OpenTelemetry commands and a composite verify. The Linux result covers
57
+ one emulated guest; macOS has not been tested.
22
58
 
23
59
  ## 2.0.0 — 19 October 2026
24
60
 
@@ -38,7 +38,7 @@ Everything exported from `consequa_x` is stable through 2.x:
38
38
  (`ToolCallCapture`, `ToolCall`, `PendingCall`, `classify_exception`, and the
39
39
  `openai_agents`, `langchain` and `claude_agent_sdk` modules). The integration
40
40
  modules follow their frameworks' public APIs; a framework release that changes
41
- those APIs may need a Consequa-X update, and each module states the version it
41
+ those APIs may need a ConseqaX update, and each module states the version it
42
42
  was tested with. The OpenTelemetry GenAI conventions are in development
43
43
  upstream, so exported `gen_ai.*` attribute names follow them as they change;
44
44
  `consequa_x.*` attributes are stable through 2.x.
@@ -0,0 +1,220 @@
1
+ # Offline 2.0 migration conformance on the retained matched traces
2
+
3
+ This is a new **post-hoc compatibility study**, using the 503 retained factual
4
+ traces from the closed 2026-10-18 matched local study. Its original denominator
5
+ remains 504 planned slots: 503 completed, one failed (`episode_00109`, invalid
6
+ policy JSON), and 896 already completed local model calls. The failed slot is
7
+ inventoried and reported; it is never regenerated or given a substitute trace.
8
+ The original outputs, labels, analysis and historical package version remain
9
+ unchanged. There are zero new model calls, action executions or service requests.
10
+
11
+ The measured corpus has **not** been processed during runner development. The
12
+ protocol is frozen only after the runner, its tests and this design are committed.
13
+ This is a prospective freeze of a post-hoc conformance analysis, not a claim that
14
+ the original experiment or the analysis hypothesis was externally preregistered.
15
+
16
+ ## Scope and feasibility
17
+
18
+ The public 2.0 `migrate_trace` accepts the saved schema `0.1` JSON and returns a
19
+ schema `1.0` trace. Its one action and assessment become one-item lists; responses
20
+ and verification receipts gain the action ID; the assessment gains an ID. The
21
+ legacy schema never recorded a clock origin, so migration declares `relative_ms`.
22
+ No epoch is inferred, and this clock-origin loss is disclosed for every trace.
23
+
24
+ The retained study uses the built-in `refund_processed` predicate. Consequently
25
+ the public 2.0 `verify(action, recorded_observation)` can independently recompute
26
+ its receipts, and `explain(trace).for_action(action_id)` supplies the per-action
27
+ assessment alignment and diagnosis codes. Target matching moved from the 1.1
28
+ explanation into the 2.0 verifier. Migration adds target IDs and findings only
29
+ when the current verifier reproduces the recorded **status, origin, ordered
30
+ effect IDs and ordered attributable effect IDs**. That is the migration
31
+ implementation's four-field condition, not a promise of byte-identical receipts.
32
+
33
+ Migration preserves old recorded conclusions by construction. Therefore the
34
+ runner treats structural preservation, migration explanation and **fresh 2.0
35
+ verification** as separate results. A successful migration alone cannot establish
36
+ verifier parity. Fresh receipts replace receipts only in a separate in-memory
37
+ trace for explanation; the historical trace remains untouched.
38
+
39
+ This study cannot establish new empirical performance for 2.0 policies, general
40
+ multi-action correctness, arbitrary custom-verifier compatibility, a recovered
41
+ absolute time origin, causal responsibility, or performance on a new population.
42
+ It evaluates compatibility with this retained single-action evidence only.
43
+
44
+ ## Frozen inputs and code
45
+
46
+ `scripts/run_v2_migration_conformance.py freeze` inventories bytes and identities;
47
+ it does not execute migration, verification, explanation, a collector or a
48
+ benchmark on any corpus trace. Import inspection is limited to source version,
49
+ module path and installed distribution metadata.
50
+
51
+ The protocol records:
52
+
53
+ - The explicit full current Git commit, complete `src/consequa_x` file inventory,
54
+ source package version `2.0.0`, project metadata, migration documentation,
55
+ existing migration tests and their development fixtures.
56
+ - Runner, dedicated tests and this document hashes. Pinned files must be tracked
57
+ and clean at freeze time; unrelated paper/research edits are allowed.
58
+ - The frozen legacy commit `940ebfcc0059c992977dd8e9f112361ff5b31edd`, its complete
59
+ package inventory and source version `1.1.0`. Every legacy runtime hash must
60
+ also match the **original study's** recorded runtime inventory.
61
+ - The complete historical study and analysis directory inventories, the 503
62
+ individual trace/explanation/receipt hashes and slot identities, the failed
63
+ slot's receipt/error, and each old analysis `consequa_state_origin` prediction.
64
+ The original finalization receipt and closed-study inventory are checked.
65
+ Evaluator truth is hashed as historical provenance, never used for a prediction
66
+ or new outcome label.
67
+ - Both exact Python executables, executable hashes and interpreter versions,
68
+ imported module paths/source versions, and ambient installed distribution
69
+ versions/locations. Imported pinned source defines behavior. A wheel's installed
70
+ metadata does not silently replace source provenance.
71
+ - The canonical mappings, planned metrics, denominators, missing-data rule,
72
+ diagnosis policy, limitations and development-fixture disclosure in `PLAN`.
73
+
74
+ Before constructing slot dictionaries, the runner requires exactly 504 unique
75
+ schedule IDs and analysis-episode IDs with equal sets, and exactly 503 unique
76
+ baseline-row IDs matching the completed episodes. Duplicate or missing IDs cannot
77
+ be hidden by dictionary overwrites. Source cleanliness checks include entire
78
+ runtime/fixture directory pathspecs, so a tracked module deleted before freeze
79
+ cannot silently disappear from the pinned inventory.
80
+
81
+ The old arm runs under a separate `-I -B` Python subprocess with only the frozen
82
+ legacy `src` explicitly inserted. It never imports the current old collector or
83
+ changes either environment. The new arm requires `PYTHONPATH` to the pinned
84
+ paper-writing `src` and checks the actual imported path and code version.
85
+
86
+ ## Comparisons and missing evidence
87
+
88
+ For every recorded receipt, fresh verification uses its **one exact evidence
89
+ observation ID** to select the saved observation. It does not select the latest
90
+ readback as a fallback. Multiple evidence items, missing identities, unsupported
91
+ predicates and runtime errors are retained as processing failures/unavailable
92
+ comparisons. The latest explanation uses the last recorded receipt and assessment
93
+ for that action, preserving recorded order rather than sorting by timestamp.
94
+
95
+ Canonical state is `satisfied → true`, `violated → false`, `unknown → null`.
96
+ Origin retains the exact `confirmed`, `other_actor` and `unknown` values. Reported
97
+ assessment retains `success`, `failure`, `partial` and `unknown`. Alignment
98
+ retains `consistent`, `contradicted` and `unassessable`. Action-linked outcome uses
99
+ each pinned version's `benchmark.targets.action_linked_consequence`; it is not
100
+ `bool(target_effect_ids)` because count, absence, external-origin and missing
101
+ provenance semantics differ.
102
+
103
+ Primary trace-level checks cover migration success; exact legacy structural
104
+ projection; schema round-trip; preservation of old receipts and reported
105
+ assessment; old re-verification versus recorded receipt core; fresh old/new core,
106
+ state, origin, action linkage and receipt identities; migrated/fresh assessment
107
+ alignment; frozen-old agreement with the saved explanation alignment and old
108
+ analysis prediction. Receipt identity includes contract ID, observed time,
109
+ ordered effect/attributable IDs, and every evidence observation ID/source/watermark.
110
+
111
+ Secondary checks retain full legacy receipt equality (including details/reason),
112
+ exact ordered diagnosis-code equality, additions/removals, migration reproduction
113
+ counts, unavailable/empty/nonempty target metadata and newly unassessable
114
+ alignment. An empty target tuple and unavailable (`null`) target matching are
115
+ separate. Existing known unassessability and newly lost assessability are separate.
116
+ 2.0 can add `UNASSESSABLE_ASSESSMENT` for known refund outcomes whose report or
117
+ target linkage cannot be judged; those changes are reported, not normalized away.
118
+ Messages, display labels and graph serialization are not primary invariants.
119
+
120
+ Every trace metric reports success/equal, failure/different and unavailable counts
121
+ over **all 503 retained traces**, plus successes divided by the original 504
122
+ planned slots. The failed historical slot is listed, not scored as semantic
123
+ disagreement. Receipt-level counts have a separate receipt denominator. Equality
124
+ of two null states, or two unassessable alignments, is agreement rather than
125
+ known-state/assessable coverage; state and alignment distributions are reported.
126
+ No failures are excluded, no retries or replacement samples are allowed, and no
127
+ inferential p-values or population-level claims are planned.
128
+
129
+ ## Reproducible commands
130
+
131
+ Use the isolated 2.0 environment for freezing and the measured new arm, and the
132
+ isolated 1.1 environment for the old worker. The published 2.0 wheel installed in
133
+ the new environment supplies metadata; `PYTHONPATH` deliberately selects the
134
+ committed, separately hashed 2.0 source. These commands do not enable Actions.
135
+
136
+ After committing the three research files, create a detached source worktree at
137
+ that exact commit, named `D:/ConsequaX-Research/paper-frozen-v2-conformance` in
138
+ this execution plan. Run the committed script there while explicitly pointing to
139
+ the historical input directories in the writing worktree. This allows the frozen
140
+ protocol to be committed in the writing worktree before measurement without
141
+ moving the execution source's pinned HEAD. Freeze to a **new** directory:
142
+
143
+ ```powershell
144
+ $env:PYTHONPATH = 'D:/ConsequaX-Research/paper-frozen-v2-conformance/src'
145
+ $env:PYTHONDONTWRITEBYTECODE = '1'
146
+ $currentRevision = (& git -C 'D:/ConsequaX-Research/paper-frozen-v2-conformance' rev-parse HEAD).Trim()
147
+ & 'D:/ConsequaX-Research/migration-2.0-venv/Scripts/python.exe' `
148
+ 'D:/ConsequaX-Research/paper-frozen-v2-conformance/scripts/run_v2_migration_conformance.py' freeze `
149
+ --expected-current-commit $currentRevision `
150
+ --study-dir 'D:/ConsequaX-Research/paper-writing/output/matched-local-study-2026-10-18' `
151
+ --analysis-dir 'D:/ConsequaX-Research/paper-writing/output/matched-local-analysis-2026-10-18' `
152
+ --legacy-root 'D:/ConsequaX-Research/paper-frozen-940ebfc' `
153
+ --legacy-python 'D:/ConsequaX-Research/analysis-1.1.0-venv/Scripts/python.exe' `
154
+ --output-dir 'D:/ConsequaX-Research/paper-writing/output/v2-migration-protocol-2026-10-19'
155
+ ```
156
+
157
+ Review the frozen protocol and record/commit its hash **before** the measured run.
158
+ Then run once, supplying the already frozen hash and a different new directory:
159
+
160
+ ```powershell
161
+ $frozenHash = (Get-Content `
162
+ 'D:/ConsequaX-Research/paper-writing/output/v2-migration-protocol-2026-10-19/protocol.sha256.json' `
163
+ -Raw | ConvertFrom-Json).sha256
164
+ & 'D:/ConsequaX-Research/migration-2.0-venv/Scripts/python.exe' `
165
+ 'D:/ConsequaX-Research/paper-frozen-v2-conformance/scripts/run_v2_migration_conformance.py' run `
166
+ --protocol 'D:/ConsequaX-Research/paper-writing/output/v2-migration-protocol-2026-10-19/protocol.json' `
167
+ --expected-protocol-sha256 $frozenHash `
168
+ --output-dir 'D:/ConsequaX-Research/paper-writing/output/v2-migration-conformance-2026-10-19'
169
+ ```
170
+
171
+ The run checks frozen hashes before computation and again before its final
172
+ receipt. It creates an exclusive `run-claim.json` beside the protocol. That claim
173
+ persists after interruption or failure and prevents retry even into another
174
+ output directory. Outputs are always created exclusively; there is no overwrite,
175
+ resume, repair, automatic retry or sample regeneration. A source or input change
176
+ requires a separately disclosed amendment, never silent reuse of this protocol.
177
+
178
+ Outputs include per-slot paired results, migrated traces, fresh receipts,
179
+ runtime metadata, an aggregate `summary.json`, an artifact inventory and a
180
+ completion receipt. Processing errors remain in the results and yield exit code
181
+ 2; semantic disagreements remain ordinary measured results. A fatal error leaves
182
+ its claim and `fatal-error.json`. No completion receipt claims input integrity
183
+ unless the final hash recheck succeeds.
184
+
185
+ Migration, migrated explanation, fresh verification and fresh explanation have
186
+ separate failure accounting. A later verifier/explanation failure preserves
187
+ successful migration, its available metrics and its migrated artifact; affected
188
+ fresh comparisons remain unavailable. A legacy re-verification failure likewise
189
+ does not erase an available recorded-alignment comparison.
190
+
191
+ ## Development checks and disclosure
192
+
193
+ The dedicated tests use the four existing schema-0.1 migration examples only:
194
+ refund timeout after commit, stale readback, another actor and record timeout
195
+ after commit. Only the timeout refund example has a saved explanation fixture;
196
+ other expected alignments/codes are explicit synthetic assertions. Additional
197
+ mutations cover receipt non-reproduction, unknown assessment, conservative target
198
+ matching, observation identity, evidence/reason versus receipt-core differences,
199
+ hash tampering, exclusive claims, denominator preservation and protocol gating.
200
+ Synthetic schedule mutations cover duplicate/missing IDs and failed-slot baseline
201
+ substitution; a mocked Git deletion checks pre-freeze source completeness.
202
+ An optional integration check invokes frozen 1.1 on the **three refund fixtures**.
203
+ No retained study trace is opened by these tests.
204
+
205
+ The existing primary development environment has pytest; the two minimal isolated
206
+ version environments need no new installed test dependencies:
207
+
208
+ ```powershell
209
+ $env:PYTHONPATH = 'D:/ConsequaX-Research/paper-writing/src'
210
+ $env:PYTHONDONTWRITEBYTECODE = '1'
211
+ $env:CONSEQUA_V2_LEGACY_ROOT = 'D:/ConsequaX-Research/paper-frozen-940ebfc'
212
+ $env:CONSEQUA_V2_LEGACY_PYTHON = 'D:/ConsequaX-Research/analysis-1.1.0-venv/Scripts/python.exe'
213
+ & 'C:/Users/DELL/OneDrive/Desktop/ConseqaX/.venv/Scripts/python.exe' -m pytest `
214
+ tests/test_v2_migration_conformance.py tests/test_migrate.py -q -p no:cacheprovider
215
+ ```
216
+
217
+ Development results are software checks, excluded from measured counts. The
218
+ manuscript must retain the original experiment's frozen 1.1.0 provenance and
219
+ describe any eventual 2.0 result separately as this offline post-hoc conformance
220
+ study.
@@ -1,8 +1,8 @@
1
- """A tool-calling agent loop, captured with Consequa-X and checked against SQLite.
1
+ """A tool-calling agent loop, captured with ConseqaX and checked against SQLite.
2
2
 
3
3
  Standard library only, offline and deterministic. A scripted support agent reads
4
4
  a customer message, decides to call an ``issue_refund`` tool, and reports what it
5
- believes happened. The tool writes to a real SQLite database. Consequa-X
5
+ believes happened. The tool writes to a real SQLite database. ConseqaX
6
6
  records the loop as it runs, then reads the outcome back through a separate
7
7
  read-only connection and verifies it with the built-in ``RecordVerifier``.
8
8
 
@@ -16,7 +16,7 @@ outcome:
16
16
  - ``stale_readback``: the tool succeeds, but readback comes from a replica that
17
17
  lags behind the contract horizon, so the outcome stays unknown.
18
18
 
19
- Run from this folder with Consequa-X 2.0 or newer installed::
19
+ Run from this folder with ConseqaX 2.0 or newer installed::
20
20
 
21
21
  python agent_loop_sqlite.py --mode timeout_after_commit --output agent-run
22
22