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.
- {consequa_x-2.1.0 → consequa_x-2.1.2}/CHANGELOG.md +39 -4
- {consequa_x-2.1.0 → consequa_x-2.1.2}/CONTRIBUTING.md +2 -2
- {consequa_x-2.1.0 → consequa_x-2.1.2}/PKG-INFO +9 -6
- {consequa_x-2.1.0 → consequa_x-2.1.2}/README.md +5 -5
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/application-integration.md +1 -1
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/design-2.0.md +1 -1
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/framework-integration.md +8 -1
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/migrating-to-2.0.md +1 -1
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/offline-reports.md +1 -1
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/opentelemetry.md +3 -3
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/product-roadmap.md +4 -2
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/quickstart.md +4 -4
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/release-notes.md +37 -1
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/stable-api.md +1 -1
- consequa_x-2.1.2/docs/v2-migration-conformance.md +220 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/examples/agent_loop_sqlite.py +3 -3
- consequa_x-2.1.2/examples/two_part_outcome.py +216 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/pyproject.toml +4 -1
- consequa_x-2.1.2/scripts/audit_external_validation_artifacts.py +458 -0
- consequa_x-2.1.2/scripts/audit_upstream_car_artifacts.py +616 -0
- consequa_x-2.1.2/scripts/audit_v2_migration_conformance.py +510 -0
- consequa_x-2.1.2/scripts/build_blinded_trace_review.py +401 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/build_public_docs.py +11 -11
- {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/build_site_demo.py +92 -21
- {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/check_installed_release.py +1 -1
- consequa_x-2.1.2/scripts/check_live_integrations.py +298 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/export_render_site.py +1 -1
- consequa_x-2.1.2/scripts/plot_external_validation.py +181 -0
- consequa_x-2.1.2/scripts/plot_upstream_car_validation.py +440 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/publish_release.py +2 -2
- consequa_x-2.1.2/scripts/run_v2_migration_conformance.py +754 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/__init__.py +1 -1
- consequa_x-2.1.2/src/consequa_x/benchmark/__init__.py +1 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/cli.py +3 -2
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/errors.py +2 -2
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/explanation.py +2 -5
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/integrations/claude_agent_sdk.py +1 -1
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/integrations/langchain.py +2 -1
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/integrations/openai_agents.py +2 -1
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/migrate.py +1 -1
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/otel.py +3 -3
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/report.py +3 -3
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/research.py +1 -1
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/schema.py +1 -1
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/schemas/trace-v1.0.json +1 -1
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x.egg-info/PKG-INFO +9 -6
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x.egg-info/SOURCES.txt +14 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_cli.py +11 -0
- consequa_x-2.1.2/tests/test_external_validation_artifact_audit.py +363 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_integration.py +3 -3
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_policy_runner.py +1 -1
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_public_integration.py +1 -1
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_site_demo.py +10 -0
- consequa_x-2.1.2/tests/test_snapshot_integrity.py +178 -0
- consequa_x-2.1.2/tests/test_two_part_example.py +77 -0
- consequa_x-2.1.2/tests/test_v2_migration_artifact_audit.py +433 -0
- consequa_x-2.1.2/tests/test_v2_migration_conformance.py +323 -0
- consequa_x-2.1.0/src/consequa_x/benchmark/__init__.py +0 -1
- consequa_x-2.1.0/tests/test_snapshot_integrity.py +0 -60
- {consequa_x-2.1.0 → consequa_x-2.1.2}/LICENSE +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/MANIFEST.in +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/SECURITY.md +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/attribution-calibration.md +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/build-contract.md +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/car-reproduction-plan.md +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/completion-plan.md +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/decision-contrastive.md +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/decision-replay.md +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/decision-shapley.md +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/design.md +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/graph-witnesses.md +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/interaction-sampling.md +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/interval-followup-plan.md +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/launch-readiness.md +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/local-pypi-setup.md +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/matched-trace-judge.md +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/policy-evaluation.md +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/policy-replay.md +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/refund-interactions.md +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/release-readiness.md +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/research-roadmap.md +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/studies/matched-local-2026-10-18.json +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/studies/refund-family-candidates-v1.json +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/study-manifests.md +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/study-plan.md +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/tau-benchmark-validation.md +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/upstream-car-comparison.md +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/v1.1-release.md +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/docs/variable-length-game-plan.md +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/examples/artifact_delivery.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/examples/decision_shapley_fixture.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/examples/report_quickstart.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/requirements-dev.lock +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/analyze_matched_local_study.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/audit_interaction_sampling.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/audit_interval_comparison.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/audit_refund_interactions.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/audit_release_artifacts.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/audit_review_revision.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/build_matched_study_figures.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/configure_pypi_auth.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/draw_paper_diagrams.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/finalize_interval_artifacts.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/finalize_matched_local_study.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/finalize_refund_artifacts.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/plot_interval_comparison.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/plot_paper_results.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/publish_alpha.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/refresh_sample_report.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/run_interaction_sampling.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/run_matched_local_study.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/run_matched_trace_judge.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/run_tau_benchmark_validation.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/run_upstream_car_study.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/summarize_interaction_sampling.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/scripts/summarize_matched_execution.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/setup.cfg +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/__main__.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/adapters/__init__.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/adapters/ollama.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/attribution.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/assessment_metrics.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/calibration.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/calibration_export.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/calibration_mechanisms.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/decision_coalition.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/decision_contrastive.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/decision_replay.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/decision_shapley.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/evaluation.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/interaction_export.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/interaction_mechanisms.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/interaction_sampling.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/interval_comparison.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/intervals.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/payments.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/policy_experiment.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/policy_runner.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/runner.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/study.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/targets.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/benchmark/templates.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/capture.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/compare.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/composite.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/graph.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/guard.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/integrations/__init__.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/mcp_capture.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/models.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/policies.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/py.typed +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/readback.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/record_verifier.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/store.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/summary.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x/verification.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x.egg-info/dependency_links.txt +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x.egg-info/entry_points.txt +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x.egg-info/requires.txt +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/src/consequa_x.egg-info/top_level.txt +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/fixtures/v0.1/README.md +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/fixtures/v0.1/record-timeout-after-commit.json +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/fixtures/v0.1/refund-another-actor.json +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/fixtures/v0.1/refund-stale-readback.json +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/fixtures/v0.1/refund-timeout-after-commit.explanation.json +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/fixtures/v0.1/refund-timeout-after-commit.json +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_agent_loop_example.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_assessment_metrics.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_async_capture.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_attribution.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_calibration.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_calibration_cli.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_calibration_mechanisms.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_capture.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_compare_verify_redact.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_composite.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_decision_coalition.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_decision_contrastive.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_decision_contrastive_cli.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_decision_replay.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_decision_shapley.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_decision_shapley_cli.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_docs_examples.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_errors.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_graph.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_graph_identity.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_installed_release_check.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_integrations.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_interaction_sampling.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_interaction_sampling_cli.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_interaction_workers.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_interval_comparison.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_interval_replay.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_intervals.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_matched_baseline_audit.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_matched_execution_summary.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_matched_figure_builder.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_matched_local_study.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_matched_study_finalizer.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_matched_trace_judge.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_mcp_capture.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_migrate.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_model_eval_integration.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_models.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_multi_action.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_ollama.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_otel.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_payments.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_policies.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_policy_evaluation.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_policy_experiment.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_policy_experiment_integration.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_prompt_profile_cli.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_readback_guard.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_record_verifier.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_refund_interactions.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_refund_interactions_cli.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_release_helpers.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_release_inventory.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_render_site_export.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_replay_targets.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_report.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_report_cli.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_research_integration.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_schema.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_stable_release.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_study.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_summary_store.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_task_templates.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_tau_benchmark_validation.py +0 -0
- {consequa_x-2.1.0 → consequa_x-2.1.2}/tests/test_upstream_car_study.py +0 -0
- {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.
|
|
8
|
-
|
|
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/
|
|
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
|
|
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
|
|
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.
|
|
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
|
-
#
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
#
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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;
|
|
@@ -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.
|
|
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,6 +1,6 @@
|
|
|
1
1
|
# OpenTelemetry export and import
|
|
2
2
|
|
|
3
|
-
`consequa_x.otel` (added in 2.1) moves
|
|
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
|
-
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
4
|
-
is required. Version 2.1.
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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
|
|