causal-continuity-engine 0.2.0__tar.gz → 0.4.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/CONTRIBUTING.md +6 -2
  2. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/scripts/check_attribution.py +12 -0
  3. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.pre-commit-config.yaml +1 -1
  4. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/AGENTS.md +12 -5
  5. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/CHANGELOG.md +55 -0
  6. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/CITATION.cff +2 -2
  7. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/PKG-INFO +61 -17
  8. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/README.md +59 -15
  9. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/__init__.py +1 -1
  10. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/engine.py +121 -6
  11. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/extraction.py +100 -1
  12. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/github.py +4 -2
  13. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/invalidation.py +28 -5
  14. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine.egg-info/PKG-INFO +61 -17
  15. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine.egg-info/SOURCES.txt +5 -0
  16. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine.egg-info/requires.txt +1 -1
  17. causal_continuity_engine-0.4.0/docs/MCP.md +270 -0
  18. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/docs/RELEASE.md +3 -3
  19. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/docs/REQUIREMENTS_COVERAGE.md +7 -7
  20. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/docs/adr/ADR-INDEX.md +188 -0
  21. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/pyproject.toml +1 -1
  22. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/requirements-dev.in +1 -1
  23. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/requirements-dev.lock +19 -19
  24. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_attribution_controls.py +39 -0
  25. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_authority_extraction.py +3 -3
  26. causal_continuity_engine-0.4.0/tests/test_contradiction_notice.py +347 -0
  27. causal_continuity_engine-0.4.0/tests/test_exact_author_association.py +90 -0
  28. causal_continuity_engine-0.4.0/tests/test_extraction_negated_cue.py +93 -0
  29. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_github_redaction.py +1 -1
  30. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_isolated_review.py +6 -0
  31. causal_continuity_engine-0.4.0/tests/test_proof_rejection_reason.py +45 -0
  32. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_release_controls.py +25 -4
  33. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.editorconfig +0 -0
  34. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.gitattributes +0 -0
  35. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.githooks/commit-msg +0 -0
  36. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.githooks/pre-commit +0 -0
  37. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/CODEOWNERS +0 -0
  38. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
  39. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  40. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/ISSUE_TEMPLATE/feature.yml +0 -0
  41. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/SECURITY.md +0 -0
  42. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/SUPPORT.md +0 -0
  43. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/dependabot.yml +0 -0
  44. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/pull_request_template.md +0 -0
  45. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/release.yml +0 -0
  46. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/ruleset.README.md +0 -0
  47. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/ruleset.json +0 -0
  48. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/scripts/bootstrap_tools.py +0 -0
  49. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/scripts/build_distributions.py +0 -0
  50. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/scripts/check_clean.py +0 -0
  51. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/scripts/check_content_marks.py +0 -0
  52. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/scripts/check_release_metadata.py +0 -0
  53. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/scripts/check_release_tag.py +0 -0
  54. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/scripts/check_stdlib.py +0 -0
  55. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/scripts/prepare_release_tag.py +0 -0
  56. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/scripts/render_api_docs.py +0 -0
  57. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/scripts/run_gates.py +0 -0
  58. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/scripts/run_isolated_review.py +0 -0
  59. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/scripts/verify_distributions.py +0 -0
  60. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/scripts/verify_public_schemas.py +0 -0
  61. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/tag-ruleset.json +0 -0
  62. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/workflows/ci.yml +0 -0
  63. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/workflows/commit-signature-audit.yml +0 -0
  64. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/workflows/content-integrity-pr.yml +0 -0
  65. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/workflows/content-integrity.yml +0 -0
  66. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/workflows/dependency-review.yml +0 -0
  67. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/workflows/no-ai-attribution.yml +0 -0
  68. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/workflows/release.yml +0 -0
  69. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/workflows/secret-scan.yml +0 -0
  70. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.gitignore +0 -0
  71. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.gitleaks.toml +0 -0
  72. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/LICENSE.txt +0 -0
  73. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/MANIFEST.in +0 -0
  74. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/NOTICE +0 -0
  75. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/SPEC.md +0 -0
  76. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/benchmarks/__init__.py +0 -0
  77. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/benchmarks/continuitybench/__init__.py +0 -0
  78. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/benchmarks/continuitybench/run.py +0 -0
  79. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/benchmarks/continuitybench/scenarios.py +0 -0
  80. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/api.py +0 -0
  81. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/capabilities.py +0 -0
  82. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/capsule.py +0 -0
  83. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/cli.py +0 -0
  84. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/core.py +0 -0
  85. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/evidence.py +0 -0
  86. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/graph.py +0 -0
  87. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/lamport.py +0 -0
  88. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/learning.py +0 -0
  89. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/mcp.py +0 -0
  90. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/memory.py +0 -0
  91. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/ontology.py +0 -0
  92. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/partial.py +0 -0
  93. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/policy.py +0 -0
  94. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/proof.py +0 -0
  95. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/py.typed +0 -0
  96. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/redaction.py +0 -0
  97. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/resume.py +0 -0
  98. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/store.py +0 -0
  99. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/verifiers.py +0 -0
  100. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine.egg-info/dependency_links.txt +0 -0
  101. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine.egg-info/entry_points.txt +0 -0
  102. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine.egg-info/top_level.txt +0 -0
  103. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/docs/API.md +0 -0
  104. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/docs/CAPABILITIES.md +0 -0
  105. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/docs/CONTENT-INGRESS-FIREWALL.md +0 -0
  106. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/docs/PUBLIC-FLIP.md +0 -0
  107. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/docs/REQUIREMENTS.md +0 -0
  108. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/docs/RESEARCH-ROADMAP.md +0 -0
  109. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/docs/TESTING.md +0 -0
  110. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/docs/V0.1.5-TRUST-CLOSURE.md +0 -0
  111. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/docs/assets/demo.svg +0 -0
  112. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/docs/assets/social-preview.png +0 -0
  113. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/examples/backfill_github.py +0 -0
  114. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/examples/quickstart.py +0 -0
  115. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/justfile +0 -0
  116. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/schemas/cce.anchor.v1.json +0 -0
  117. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/schemas/cce.capsule.v1.json +0 -0
  118. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/schemas/cce.capsule.v2.json +0 -0
  119. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/schemas/cce.continuity-receipt.v1.json +0 -0
  120. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/schemas/cce.continuity-receipt.v2.json +0 -0
  121. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/schemas/cce.event.v1.json +0 -0
  122. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/schemas/cce.proof-predicate.v1.json +0 -0
  123. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/schemas/cce.proof-predicate.v2.json +0 -0
  124. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/schemas/cce.proof.v1.json +0 -0
  125. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/schemas/cce.proof.v2.json +0 -0
  126. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/schemas/cce.recovery.v1.json +0 -0
  127. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/schemas/cce.resume.v1.json +0 -0
  128. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/schemas/cce.resume.v2.json +0 -0
  129. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/setup.cfg +0 -0
  130. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/__init__.py +0 -0
  131. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/authority_helpers.py +0 -0
  132. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/schema_validation.py +0 -0
  133. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_api_contract.py +0 -0
  134. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_authority_atomic_append.py +0 -0
  135. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_authority_cli.py +0 -0
  136. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_authority_consumers.py +0 -0
  137. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_authority_criticality.py +0 -0
  138. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_authority_producer.py +0 -0
  139. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_authority_read_reuse.py +0 -0
  140. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_authority_redteam.py +0 -0
  141. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_authority_withdrawal_classification.py +0 -0
  142. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_benchmark_authority.py +0 -0
  143. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_benchmark_cleanup.py +0 -0
  144. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_benchmark_runner.py +0 -0
  145. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_capsule_packet_clock.py +0 -0
  146. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_cli.py +0 -0
  147. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_conformance.py +0 -0
  148. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_content_marks.py +0 -0
  149. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_distribution_environment.py +0 -0
  150. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_engine_e2e.py +0 -0
  151. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_identity_compatibility.py +0 -0
  152. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_installed_contracts.py +0 -0
  153. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_installed_packet_bounds.py +0 -0
  154. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_instrument_validation.py +0 -0
  155. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_invalidation_resume.py +0 -0
  156. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_learning_partial_api.py +0 -0
  157. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_mcp_server.py +0 -0
  158. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_memory_extraction.py +0 -0
  159. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_obligation_boundaries.py +0 -0
  160. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_obligation_completeness.py +0 -0
  161. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_obligation_contract_repairs.py +0 -0
  162. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_packet_byte_bounds.py +0 -0
  163. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_packet_byte_transports.py +0 -0
  164. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_packet_complete_trust.py +0 -0
  165. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_packet_failure_boundaries.py +0 -0
  166. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_packet_scope_receipts.py +0 -0
  167. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_packet_scope_wire.py +0 -0
  168. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_packet_validity_frontier.py +0 -0
  169. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_processor_compatibility.py +0 -0
  170. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_proof_obligation_wire.py +0 -0
  171. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_readme_contract.py +0 -0
  172. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_receipt_spec_contract.py +0 -0
  173. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions.py +0 -0
  174. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round10_release.py +0 -0
  175. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round11_deep_integrity.py +0 -0
  176. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round12_release_blockers.py +0 -0
  177. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round13_jcs.py +0 -0
  178. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round14_state_integrity.py +0 -0
  179. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round15_capsule_invalidation_github.py +0 -0
  180. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round15_public_boundaries.py +0 -0
  181. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round15_storage_boundaries.py +0 -0
  182. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round16_cli_api_core_capabilities.py +0 -0
  183. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round17_backfill_layout.py +0 -0
  184. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round18_assumption_edits.py +0 -0
  185. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round18_co_assertion.py +0 -0
  186. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round18_journal.py +0 -0
  187. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round18_negation.py +0 -0
  188. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round18_source_order.py +0 -0
  189. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round2.py +0 -0
  190. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round3.py +0 -0
  191. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round4.py +0 -0
  192. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round5.py +0 -0
  193. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round6.py +0 -0
  194. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round7.py +0 -0
  195. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round8_boundaries.py +0 -0
  196. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round8_engine.py +0 -0
  197. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round8_portability.py +0 -0
  198. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round8_state.py +0 -0
  199. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round9_integrity.py +0 -0
  200. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round9_scope_freshness.py +0 -0
  201. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_release_boundary_validation.py +0 -0
  202. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_resume_prose_origin.py +0 -0
  203. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_schema_release_identities.py +0 -0
  204. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_sqlite_lifecycle.py +0 -0
  205. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_store_graph.py +0 -0
  206. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_task_packet_review.py +0 -0
  207. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_task_packets.py +0 -0
  208. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_trust.py +0 -0
  209. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/action_intent_wrong_type.json +0 -0
  210. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/actor_wrong_type.json +0 -0
  211. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/created_at_invalid_calendar_date.json +0 -0
  212. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/created_at_leap_second.json +0 -0
  213. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/created_at_lowercase_designators.json +0 -0
  214. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/created_at_missing_timezone.json +0 -0
  215. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/created_at_noncanonical_offset.json +0 -0
  216. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/created_at_space_separator.json +0 -0
  217. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/empty_required_authoritative_failure.json +0 -0
  218. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/empty_required_authoritative_pass.json +0 -0
  219. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/empty_required_no_results.json +0 -0
  220. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/empty_required_self_asserted_pass.json +0 -0
  221. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/generate.py +0 -0
  222. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/historical_proof_version.json +0 -0
  223. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/incomplete_failed_check.json +0 -0
  224. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/index.json +0 -0
  225. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/input_item_wrong_type.json +0 -0
  226. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/invalid_result_value.json +0 -0
  227. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/lamport_fingerprint_spoof.json +0 -0
  228. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/lamport_no_registry.json +0 -0
  229. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/lamport_truncated_key.json +0 -0
  230. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/missing_required_field.json +0 -0
  231. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/non_binary64_integer.json +0 -0
  232. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/obligation_duplicate.json +0 -0
  233. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/obligation_duplicate_task.json +0 -0
  234. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/obligation_missing.json +0 -0
  235. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/obligation_wrong_kind.json +0 -0
  236. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/obligation_wrong_task.json +0 -0
  237. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/policy_decision_wrong_type.json +0 -0
  238. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/retry_cannot_launder_a_failure.json +0 -0
  239. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/self_asserted_cannot_satisfy.json +0 -0
  240. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/self_assertion_cannot_poison_authoritative_pass.json +0 -0
  241. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/status_contradicts_contents.json +0 -0
  242. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/summary_contradicts_contents.json +0 -0
  243. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/tamper_statement.json +0 -0
  244. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/tamper_statement_resealed.json +0 -0
  245. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/task_id_under_unrelated_field.json +0 -0
  246. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/unbound_task.json +0 -0
  247. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/unknown_action_intent_field.json +0 -0
  248. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/unknown_algorithm.json +0 -0
  249. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/unknown_evidence_context_field.json +0 -0
  250. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/unknown_execution_field.json +0 -0
  251. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/unknown_schema_version.json +0 -0
  252. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/unknown_top_level_field.json +0 -0
  253. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/unknown_verification_field.json +0 -0
  254. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/unverified_forged_body_no_key.json +0 -0
  255. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/unverified_hmac_no_key.json +0 -0
  256. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/valid_hmac.json +0 -0
  257. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/valid_hmac_jcs_edges.json +0 -0
  258. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/valid_hmac_unicode.json +0 -0
  259. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/valid_lamport.json +0 -0
  260. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/wrong_project.json +0 -0
  261. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/verifiers/__init__.py +0 -0
  262. {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/verifiers/verify_proof.py +0 -0
@@ -53,7 +53,7 @@ do. `just setup` installs every direct and transitive tool from
53
53
  `requirements-dev.lock` in pip's all-or-nothing hash-checking mode, refuses
54
54
  source distributions, then installs `causal-continuity-engine` editable without dependency
55
55
  resolution or an isolated build environment. The reviewed direct inputs are
56
- `pytest` 9.1.1, `ruff` 0.16.7, `build` 1.6.1, `jsonschema` 4.26.0,
56
+ `pytest` 9.1.1, `ruff` 0.16.10, `build` 1.6.1, `jsonschema` 4.26.0,
57
57
  `setuptools` 84.0.0, and `pip` 26.2.1. None is imported by the engine; jsonschema validates
58
58
  emitted receipt instances only in the test/release gate.
59
59
 
@@ -258,7 +258,11 @@ outcome, say what distinguishes it from "nothing happened".
258
258
 
259
259
  **No authorship attribution to tooling.** The `.githooks/` hooks and the CI
260
260
  attribution guard both reject it, in commit messages and in committed files.
261
- Do not work around them.
261
+ Do not work around them. This is a rule about credit, not secrecy: AI coding
262
+ assistants are used in this project's development, and every change is
263
+ reviewed, tested, signed off, and committed by the maintainer, who is
264
+ responsible for it. If AI tools did significant work on your patch, say so in
265
+ plain words in the pull request; never list a tool as an author or co-author.
262
266
 
263
267
  ## Security
264
268
 
@@ -76,6 +76,13 @@ _ARTIFACT_AI_CREDIT = re.compile(
76
76
  _TOOL_BYLINE = re.compile(
77
77
  rf"{_AI_ALIAS.pattern}\s*\((?:anthropic|openai)\)[.!]?"
78
78
  )
79
+ # An AI coding session appends provenance rather than credit: a trailer whose key
80
+ # names the tool ("<tool>-Session: <link>") and a bare link to the session. Neither
81
+ # names an actor, so the credit grammar above never reached them.
82
+ _AI_SESSION_KEY = re.compile(
83
+ rf"{_AI_ALIAS.pattern}[- ]session(?:[- ](?:id|link|url))?"
84
+ )
85
+ _AI_SESSION_LINK = re.compile(r"<?https?://claude\.ai/code/session_[a-z0-9_-]+/?>?")
79
86
  _TRAILER_KEYS = frozenset({
80
87
  "assisted-by",
81
88
  "authored-by",
@@ -233,6 +240,11 @@ def scan_prose(
233
240
  key, separator, value = line.partition(":")
234
241
  if separator and key.replace("_", "-") in _TRAILER_KEYS:
235
242
  reason = _actor_reason(value)
243
+ if reason is None and separator and _AI_SESSION_KEY.fullmatch(
244
+ key.replace("_", "-")):
245
+ reason = "tool/model session trailer"
246
+ if reason is None and _AI_SESSION_LINK.fullmatch(line):
247
+ reason = "tool/model session link"
236
248
  if reason is None:
237
249
  match = _CREDIT.fullmatch(line) or _ROLE.fullmatch(line)
238
250
  if match is not None:
@@ -43,7 +43,7 @@ repos:
43
43
  - id: check-merge-conflict
44
44
 
45
45
  - repo: https://github.com/astral-sh/ruff-pre-commit
46
- rev: e8f7d69b957a30acb2c875078d5fd012de24b64c # v0.16.7
46
+ rev: f12be1ebaa5351c1fc76472de98db2c3446c8253 # v0.16.10
47
47
  hooks:
48
48
  # Lint only, matching `just lint` and CI. Formatting is advisory in this
49
49
  # project and deliberately not a gate: the tree was hand-formatted before
@@ -14,9 +14,13 @@ history and a bi-temporal causal graph. Event-derived projections are
14
14
  rebuildable only while source payloads remain inside the retention window;
15
15
  runtime records are authenticated/audited rather than replay-derived. Memory
16
16
  tiers L0–L4 and token-budgeted Resume Packets are what
17
- an agent actually receives on resume. When a requirement changes or evidence
18
- contradicts an assumption, causal invalidation computes the blast radius
19
- over typed edges, bounds it, and classifies it deterministically. When policy
17
+ an agent actually receives on resume. When a requirement changes, when the
18
+ source that stated an assumption withdraws it, or when an integration records
19
+ contradicting evidence through `engine.invalidation.fire(...)`, causal
20
+ invalidation computes the blast radius over typed edges, bounds it, and
21
+ classifies it deterministically. It does not read prose for meaning; a trusted
22
+ explicit negation of an active assumption's own wording raises a human-gated
23
+ notice (ADR-133). When policy
20
24
  requires proof, a task cannot be marked complete without a signed proof envelope
21
25
  whose required verifiers actually ran — `Engine.complete_task` has twenty-two
22
26
  independently instrumented rejection gates, including current confirmed authority,
@@ -325,8 +329,11 @@ below what it is about to do (ADR-048).
325
329
 
326
330
  Never add AI authorship credit to a commit message, PR title or body, code
327
331
  comment, documentation file, changelog, or example. No co-author trailers,
328
- no "generated with" lines, no tool bylines, no mention of AI involvement in
329
- this codebase anywhere.
332
+ no "generated with" lines, no tool bylines. This is a rule about credit, not
333
+ secrecy: `.github/CONTRIBUTING.md` states plainly that AI coding assistants
334
+ are used in development and that the maintainer reviews, tests, and commits
335
+ every change. Disclosure in plain words is allowed; crediting a tool as an
336
+ author is not.
330
337
 
331
338
  This is enforced, not requested. `.githooks/commit-msg` and
332
339
  `.githooks/pre-commit` block it locally (`core.hooksPath` is set to
@@ -9,6 +9,61 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
9
9
 
10
10
  No unreleased changes.
11
11
 
12
+ ## 0.4.0 — 2026-10-17
13
+
14
+ ### Changed
15
+
16
+ - **Breaking: processor compatibility advances to `cce-processor/1.11.0`;
17
+ extraction stays `cce-deterministic/1.5.0`.** Preserve older projected stores
18
+ and their SQLite sidecars after stopping writers. Re-ingest retained sources
19
+ into a separate new store/project and review its proposals before confirming
20
+ them. Older projections do not upgrade in place; erased source payloads
21
+ cannot be reconstructed by replay (ADR-114, ADR-134).
22
+
23
+ ### Fixed
24
+
25
+ - **A GitHub author association is trusted only in GitHub's exact spelling.**
26
+ Text authority upper-cased the association before comparing it, so a payload
27
+ carrying `owner` or `Member` was read as maintainer intent and could raise an
28
+ ADR-133 notice, while command authorization compared exactly and refused the
29
+ same value. Both now accept only `OWNER`, `MEMBER` and `COLLABORATOR`; any
30
+ other spelling is untrusted content. GitHub itself sends only the upper-case
31
+ values, so webhook data is unaffected (ADR-134).
32
+
33
+ ## 0.3.0 — 2026-10-16
34
+
35
+ ### Added
36
+
37
+ - **A trusted explicit negation of an active assumption raises a human-gated
38
+ notice.** An OWNER, MEMBER or COLLABORATOR sentence that restates an active
39
+ assumption with one negator ("the feed is NOT ordered by timestamp"), negates
40
+ its cue ("we no longer assume …") or calls it wrong fires a
41
+ `contradictory_evidence` invalidation in `pending_confirmation`: nothing
42
+ changes until the owner records `confirm_invalidation` or
43
+ `reject_invalidation` through `authority --request`, with operands from
44
+ `Engine.authority_invalidation`. The notice appears in the resume packet and
45
+ makes `check` report `action_required`. The rule is closed and lexical; other
46
+ wordings are outside it (ADR-133).
47
+
48
+ ### Changed
49
+
50
+ - **Breaking: processor compatibility advances to `cce-processor/1.10.0` and
51
+ extraction to `cce-deterministic/1.5.0`.** Preserve older projected stores and
52
+ their SQLite sidecars after stopping writers. Re-ingest retained sources into
53
+ a separate new store/project and review its proposals before confirming them.
54
+ Older projections do not upgrade in place; erased source payloads cannot be
55
+ reconstructed by replay (ADR-114, ADR-132).
56
+
57
+ ### Fixed
58
+
59
+ - **A negated assumption cue no longer proposes the assumption it denies.**
60
+ "We no longer assume X", "We do not assume X" and "nothing relies on X"
61
+ extracted the same positive proposal as "We assume X", so a sentence written
62
+ to retire an assumption offered it for confirmation. The extractor now
63
+ abstains when a negator stands immediately before the cue. A prohibition or
64
+ decision form still proposes the constraint or decision the author wrote;
65
+ other wordings of a denial are outside this closed rule (ADR-132).
66
+
12
67
  ## 0.2.0 — 2026-09-23
13
68
 
14
69
  ### Changed
@@ -8,8 +8,8 @@ authors:
8
8
  - given-names: Thomas
9
9
  family-names: Albrecht
10
10
  alias: The Quantum Falcon
11
- version: 0.2.0
12
- date-released: 2026-09-23
11
+ version: 0.4.0
12
+ date-released: 2026-10-17
13
13
  license: Apache-2.0
14
14
  repository-code: https://github.com/thequantumfalcon/causal-continuity-engine
15
15
  url: https://github.com/thequantumfalcon/causal-continuity-engine
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: causal-continuity-engine
3
- Version: 0.2.0
3
+ Version: 0.4.0
4
4
  Summary: Causal Continuity Engine - continuity, causal invalidation, and proof for long-running coding agents
5
5
  Author: Thomas Albrecht
6
6
  License-Expression: Apache-2.0
@@ -27,7 +27,7 @@ License-File: LICENSE.txt
27
27
  License-File: NOTICE
28
28
  Provides-Extra: dev
29
29
  Requires-Dist: pytest==9.1.1; extra == "dev"
30
- Requires-Dist: ruff==0.16.7; extra == "dev"
30
+ Requires-Dist: ruff==0.16.10; extra == "dev"
31
31
  Requires-Dist: build==1.6.1; extra == "dev"
32
32
  Requires-Dist: jsonschema==4.26.0; extra == "dev"
33
33
  Requires-Dist: pip==26.2.1; extra == "dev"
@@ -71,9 +71,16 @@ and neither is an unexamined green check.
71
71
  CCE addresses each with a mechanism rather than a better prompt. Decisions,
72
72
  assumptions, requirements and evidence become nodes in a bi-temporal causal
73
73
  graph over an application-enforced append-only, hash-chained event log, so
74
- *why* is a queryable edge and not a memory. When a requirement changes or evidence contradicts an assumption, the
74
+ *why* is a queryable edge and not a memory. When a requirement changes, when the
75
+ source that stated an assumption withdraws it, or when an integration records
76
+ contradicting evidence through `engine.invalidation.fire(...)`, the
75
77
  blast radius is computed over typed edges, bounded, and classified
76
- deterministically. When policy requires proof, a task cannot be marked complete
78
+ deterministically. CCE does not read prose for meaning. It does recognize one
79
+ closed form: a trusted comment that restates an active assumption with a
80
+ negator, like the one above, raises a human-gated notice that changes nothing
81
+ until the owner confirms or rejects it; a differently worded dispute proposes
82
+ nothing and fires nothing.
83
+ When policy requires proof, a task cannot be marked complete
77
84
  without a signed envelope whose required verifiers actually ran — the rejection gates are
78
85
  mechanically enumerated and mutation-tested below.
79
86
 
@@ -97,7 +104,9 @@ command are already used by an unrelated published project.
97
104
  ## Use it from an editor
98
105
 
99
106
  `cce-engine mcp` speaks the Model Context Protocol over stdio, so an MCP client
100
- can read a project's control state directly. Four read-only tools:
107
+ can read a project's control state directly. [docs/MCP.md](docs/MCP.md) walks the
108
+ whole path on this repository, from install to a connected agent, and shows how
109
+ the continuity check runs in CI on a runner that holds the store. Four read-only tools:
101
110
  `resume_packet`, `list_assumptions`, `list_invalidations`, `continuity_check`.
102
111
 
103
112
  The subcommand first ships in 0.1.6. The published 0.1.0, 0.1.2 and 0.1.3
@@ -136,9 +145,11 @@ than the official SDK, which would pull in more than twenty packages.
136
145
 
137
146
  ## Quickstart
138
147
 
139
- The installation commands below install the package PyPI currently serves; to
140
- run this exact checkout, including its authority and v2 packet examples, use
141
- the editable installation that follows.
148
+ Install either the published package (the next blocks) or this checkout (the
149
+ editable installation further down), not both: one virtual environment is
150
+ enough. The published package runs this quickstart when this checkout is the
151
+ release PyPI serves; for `main` between releases, or your own changes, use the
152
+ editable installation.
142
153
 
143
154
  Python 3.11 or newer is required; the engine has no third-party runtime
144
155
  dependencies. Choose the block for your platform and run it in a new working
@@ -165,15 +176,15 @@ with `.\.venv\Scripts\python.exe -m pip install causal-continuity-engine`
165
176
  and invoke the environment's `cce-engine.exe` by its absolute path in the
166
177
  commands below. After activation, `cce-engine --help` checks the installation.
167
178
 
168
- **Upgrading an existing project:** this release uses processor 1.9.0 and
169
- extractor 1.4.0; projections written by 0.1.6's processor 1.8.0 or earlier
179
+ **Upgrading an existing project:** this release uses processor 1.11.0 and
180
+ extractor 1.5.0; projections written by 0.3.0's processor 1.10.0 or earlier
170
181
  processors are refused. There is no in-place projection or authority upgrade. Stop writers,
171
182
  preserve the complete old project state (including its database and any SQLite
172
183
  sidecars), and re-ingest retained sources into a separate new project/store.
173
184
  Review and explicitly confirm the new proposals there; old prose is not approval.
174
185
  Do not remove markers or sidecars to bypass refusal. Payloads already removed
175
186
  by retention cannot be reconstructed from their digests. New users can simply
176
- start a fresh project. See [the upgrade notes for this release](CHANGELOG.md#020--2026-09-23);
187
+ start a fresh project. See [the upgrade notes for this release](CHANGELOG.md#040--2026-10-17);
177
188
  the [0.1.6 notes](CHANGELOG.md#016--2026-09-20) remain historical.
178
189
 
179
190
  To run this exact checkout instead of the published package, or to work on the
@@ -189,7 +200,20 @@ python -m pip install -e .
189
200
  ```
190
201
 
191
202
  On Windows, use the PowerShell environment-creation and activation commands
192
- above, then `python -m pip install -e .` from the checkout.
203
+ above, then `python -m pip install -e .` from the checkout. Keep that
204
+ environment active and `cd` back to your new working directory before the steps
205
+ below, so `cce-demo` and its secrets are not created inside the checkout.
206
+
207
+ The editable install is enough for the engine but not for the test suite,
208
+ which fails at collection without the hash-locked development tools. Install
209
+ them with `python -m pip install -r requirements-dev.lock` (or `just setup`),
210
+ then run `python -m pytest tests` from the checkout. The project configuration
211
+ already adds `-q`; adding another hides the closing pass/skip summary. The full
212
+ suite can take around fifteen minutes. A few tests skip when the environment
213
+ lacks what they exercise; `-rs` lists each skip with its reason. To see the
214
+ completion gates described below exercised, run
215
+ `python -m pytest tests/test_instrument_validation.py`: it plants each defect a
216
+ gate exists to catch and checks that the named gate catches it.
193
217
 
194
218
  Global flags come **before** the subcommand: `cce-engine --dir <path> <subcommand>`.
195
219
 
@@ -391,6 +415,8 @@ Response: cli-markdown | max bytes: 131072
391
415
  The full human view renders each schema field or declares it as metadata kept
392
416
  in canonical JSON. Use `resume --format json` for those complete canonical
393
417
  field values, including signatures, digests and the state-basis object.
418
+ Recent context lists retrieved nodes by their text; an event node has none, so
419
+ it appears by its id alone (`- (evt_...)`).
394
420
 
395
421
  The named verification gap is expected on a fresh project: proof is required
396
422
  by default, but CCE cannot safely invent a project-specific verifier
@@ -707,10 +733,17 @@ Published v1 schemas remain historical contracts; v1 proofs are not current
707
733
  completion evidence. The v2 schema URLs are bound to the `v0.2.0` release tag,
708
734
  and the release workflow verifies that each serves the checked-out bytes.
709
735
 
736
+ `verify_proof.py` is a single file. Installing the published package places a
737
+ copy under the environment's `share/causal-continuity-engine/audit/verifiers/`;
738
+ with an editable install, use the checkout's `verifiers/verify_proof.py`. From
739
+ the project directory:
740
+
710
741
  ```bash
711
742
  # The complete configured verifier set must already be pinned in project policy.
712
743
  cce-engine --dir . --json verify > proof.json
713
- python verifiers/verify_proof.py proof.json
744
+ VERIFY_PROOF="$VIRTUAL_ENV/share/causal-continuity-engine/audit/verifiers/verify_proof.py"
745
+ # editable install: VERIFY_PROOF=/absolute/path/to/this/local/checkout/verifiers/verify_proof.py
746
+ python "$VERIFY_PROOF" proof.json
714
747
  ```
715
748
 
716
749
  ```text
@@ -718,6 +751,8 @@ UNVERIFIED means nothing was established, not that nothing is wrong.
718
751
  An hmac-sha256 envelope needs --hmac-key-hex; a lamport envelope needs --fingerprint
719
752
  from a source other than the envelope itself.
720
753
  UNVERIFIED C1:P C2:S C3:S C4:P C5:S proof.json
754
+
755
+ 1 UNVERIFIED
721
756
  ```
722
757
 
723
758
  **That verdict is the honest one, and it is the point.** `hmac-sha256` is not
@@ -725,10 +760,15 @@ a third-party-verifiable scheme at all. Without the secret, an untouched
725
760
  envelope and a resealed forgery are indistinguishable, so the verifier reports
726
761
  `UNVERIFIED` — not `VALID` — and exits 2. A verifier that returned `VALID`
727
762
  there would be telling a stranger that a body a forger rewrote and resealed is
728
- sound. Supply the key and the same envelope verifies:
763
+ sound. Supply the key and the same envelope verifies. For `hmac-sha256` the key
764
+ is the project's local signing key, `.cce/secrets/signing.key`, given as hex.
765
+ Anyone holding it can also seal a forgery, so this is the operator's own check,
766
+ not a stranger's. The command below puts the key on the command line; run it
767
+ only on a machine you control:
729
768
 
730
769
  ```bash
731
- python verifiers/verify_proof.py proof.json --hmac-key-hex <hex>
770
+ python "$VERIFY_PROOF" proof.json \
771
+ --hmac-key-hex "$(python -c "import pathlib; print(pathlib.Path('.cce/secrets/signing.key').read_bytes().hex())")"
732
772
  # VALID C1:P C2:P C3:P C4:P C5:S proof.json
733
773
  ```
734
774
 
@@ -738,7 +778,7 @@ Reaching `VALID` as a stranger requires the fingerprint from somewhere other
738
778
  than the artifact:
739
779
 
740
780
  ```bash
741
- python verifiers/verify_proof.py proof.json --fingerprint sha256:...
781
+ python "$VERIFY_PROOF" proof.json --fingerprint sha256:...
742
782
  ```
743
783
 
744
784
  The verifier's input boundary is deliberately finite. One invocation accepts
@@ -763,8 +803,9 @@ and `INVALID` dominates — a batch containing both an `INVALID` and an
763
803
  Check that the reference implementation still agrees with the corpus:
764
804
 
765
805
  ```bash
806
+ # from the checkout
766
807
  python vectors/generate.py --check
767
- # reference agrees with every committed vector
808
+ # reference agrees with all 50 committed vectors
768
809
  ```
769
810
 
770
811
  ## What this does not do
@@ -899,6 +940,9 @@ condition.
899
940
  - [docs/PUBLIC-FLIP.md](docs/PUBLIC-FLIP.md) — the register of every control
900
941
  that could not be enabled while this repository was private, with the exact
901
942
  command that turned each one on at the flip.
943
+ - [docs/MCP.md](docs/MCP.md) — connecting an agent over MCP, walked end to end on
944
+ this repository: install, init, ingest real events, confirm, verify, packet, check,
945
+ client configuration, and the freshness rule.
902
946
  - [docs/RELEASE.md](docs/RELEASE.md) — the reproducible, signed, immutable-ready
903
947
  release procedure and its continuity-bound attestation roadmap.
904
948
  - [docs/RESEARCH-ROADMAP.md](docs/RESEARCH-ROADMAP.md) — standards-backed
@@ -36,9 +36,16 @@ and neither is an unexamined green check.
36
36
  CCE addresses each with a mechanism rather than a better prompt. Decisions,
37
37
  assumptions, requirements and evidence become nodes in a bi-temporal causal
38
38
  graph over an application-enforced append-only, hash-chained event log, so
39
- *why* is a queryable edge and not a memory. When a requirement changes or evidence contradicts an assumption, the
39
+ *why* is a queryable edge and not a memory. When a requirement changes, when the
40
+ source that stated an assumption withdraws it, or when an integration records
41
+ contradicting evidence through `engine.invalidation.fire(...)`, the
40
42
  blast radius is computed over typed edges, bounded, and classified
41
- deterministically. When policy requires proof, a task cannot be marked complete
43
+ deterministically. CCE does not read prose for meaning. It does recognize one
44
+ closed form: a trusted comment that restates an active assumption with a
45
+ negator, like the one above, raises a human-gated notice that changes nothing
46
+ until the owner confirms or rejects it; a differently worded dispute proposes
47
+ nothing and fires nothing.
48
+ When policy requires proof, a task cannot be marked complete
42
49
  without a signed envelope whose required verifiers actually ran — the rejection gates are
43
50
  mechanically enumerated and mutation-tested below.
44
51
 
@@ -62,7 +69,9 @@ command are already used by an unrelated published project.
62
69
  ## Use it from an editor
63
70
 
64
71
  `cce-engine mcp` speaks the Model Context Protocol over stdio, so an MCP client
65
- can read a project's control state directly. Four read-only tools:
72
+ can read a project's control state directly. [docs/MCP.md](docs/MCP.md) walks the
73
+ whole path on this repository, from install to a connected agent, and shows how
74
+ the continuity check runs in CI on a runner that holds the store. Four read-only tools:
66
75
  `resume_packet`, `list_assumptions`, `list_invalidations`, `continuity_check`.
67
76
 
68
77
  The subcommand first ships in 0.1.6. The published 0.1.0, 0.1.2 and 0.1.3
@@ -101,9 +110,11 @@ than the official SDK, which would pull in more than twenty packages.
101
110
 
102
111
  ## Quickstart
103
112
 
104
- The installation commands below install the package PyPI currently serves; to
105
- run this exact checkout, including its authority and v2 packet examples, use
106
- the editable installation that follows.
113
+ Install either the published package (the next blocks) or this checkout (the
114
+ editable installation further down), not both: one virtual environment is
115
+ enough. The published package runs this quickstart when this checkout is the
116
+ release PyPI serves; for `main` between releases, or your own changes, use the
117
+ editable installation.
107
118
 
108
119
  Python 3.11 or newer is required; the engine has no third-party runtime
109
120
  dependencies. Choose the block for your platform and run it in a new working
@@ -130,15 +141,15 @@ with `.\.venv\Scripts\python.exe -m pip install causal-continuity-engine`
130
141
  and invoke the environment's `cce-engine.exe` by its absolute path in the
131
142
  commands below. After activation, `cce-engine --help` checks the installation.
132
143
 
133
- **Upgrading an existing project:** this release uses processor 1.9.0 and
134
- extractor 1.4.0; projections written by 0.1.6's processor 1.8.0 or earlier
144
+ **Upgrading an existing project:** this release uses processor 1.11.0 and
145
+ extractor 1.5.0; projections written by 0.3.0's processor 1.10.0 or earlier
135
146
  processors are refused. There is no in-place projection or authority upgrade. Stop writers,
136
147
  preserve the complete old project state (including its database and any SQLite
137
148
  sidecars), and re-ingest retained sources into a separate new project/store.
138
149
  Review and explicitly confirm the new proposals there; old prose is not approval.
139
150
  Do not remove markers or sidecars to bypass refusal. Payloads already removed
140
151
  by retention cannot be reconstructed from their digests. New users can simply
141
- start a fresh project. See [the upgrade notes for this release](CHANGELOG.md#020--2026-09-23);
152
+ start a fresh project. See [the upgrade notes for this release](CHANGELOG.md#040--2026-10-17);
142
153
  the [0.1.6 notes](CHANGELOG.md#016--2026-09-20) remain historical.
143
154
 
144
155
  To run this exact checkout instead of the published package, or to work on the
@@ -154,7 +165,20 @@ python -m pip install -e .
154
165
  ```
155
166
 
156
167
  On Windows, use the PowerShell environment-creation and activation commands
157
- above, then `python -m pip install -e .` from the checkout.
168
+ above, then `python -m pip install -e .` from the checkout. Keep that
169
+ environment active and `cd` back to your new working directory before the steps
170
+ below, so `cce-demo` and its secrets are not created inside the checkout.
171
+
172
+ The editable install is enough for the engine but not for the test suite,
173
+ which fails at collection without the hash-locked development tools. Install
174
+ them with `python -m pip install -r requirements-dev.lock` (or `just setup`),
175
+ then run `python -m pytest tests` from the checkout. The project configuration
176
+ already adds `-q`; adding another hides the closing pass/skip summary. The full
177
+ suite can take around fifteen minutes. A few tests skip when the environment
178
+ lacks what they exercise; `-rs` lists each skip with its reason. To see the
179
+ completion gates described below exercised, run
180
+ `python -m pytest tests/test_instrument_validation.py`: it plants each defect a
181
+ gate exists to catch and checks that the named gate catches it.
158
182
 
159
183
  Global flags come **before** the subcommand: `cce-engine --dir <path> <subcommand>`.
160
184
 
@@ -356,6 +380,8 @@ Response: cli-markdown | max bytes: 131072
356
380
  The full human view renders each schema field or declares it as metadata kept
357
381
  in canonical JSON. Use `resume --format json` for those complete canonical
358
382
  field values, including signatures, digests and the state-basis object.
383
+ Recent context lists retrieved nodes by their text; an event node has none, so
384
+ it appears by its id alone (`- (evt_...)`).
359
385
 
360
386
  The named verification gap is expected on a fresh project: proof is required
361
387
  by default, but CCE cannot safely invent a project-specific verifier
@@ -672,10 +698,17 @@ Published v1 schemas remain historical contracts; v1 proofs are not current
672
698
  completion evidence. The v2 schema URLs are bound to the `v0.2.0` release tag,
673
699
  and the release workflow verifies that each serves the checked-out bytes.
674
700
 
701
+ `verify_proof.py` is a single file. Installing the published package places a
702
+ copy under the environment's `share/causal-continuity-engine/audit/verifiers/`;
703
+ with an editable install, use the checkout's `verifiers/verify_proof.py`. From
704
+ the project directory:
705
+
675
706
  ```bash
676
707
  # The complete configured verifier set must already be pinned in project policy.
677
708
  cce-engine --dir . --json verify > proof.json
678
- python verifiers/verify_proof.py proof.json
709
+ VERIFY_PROOF="$VIRTUAL_ENV/share/causal-continuity-engine/audit/verifiers/verify_proof.py"
710
+ # editable install: VERIFY_PROOF=/absolute/path/to/this/local/checkout/verifiers/verify_proof.py
711
+ python "$VERIFY_PROOF" proof.json
679
712
  ```
680
713
 
681
714
  ```text
@@ -683,6 +716,8 @@ UNVERIFIED means nothing was established, not that nothing is wrong.
683
716
  An hmac-sha256 envelope needs --hmac-key-hex; a lamport envelope needs --fingerprint
684
717
  from a source other than the envelope itself.
685
718
  UNVERIFIED C1:P C2:S C3:S C4:P C5:S proof.json
719
+
720
+ 1 UNVERIFIED
686
721
  ```
687
722
 
688
723
  **That verdict is the honest one, and it is the point.** `hmac-sha256` is not
@@ -690,10 +725,15 @@ a third-party-verifiable scheme at all. Without the secret, an untouched
690
725
  envelope and a resealed forgery are indistinguishable, so the verifier reports
691
726
  `UNVERIFIED` — not `VALID` — and exits 2. A verifier that returned `VALID`
692
727
  there would be telling a stranger that a body a forger rewrote and resealed is
693
- sound. Supply the key and the same envelope verifies:
728
+ sound. Supply the key and the same envelope verifies. For `hmac-sha256` the key
729
+ is the project's local signing key, `.cce/secrets/signing.key`, given as hex.
730
+ Anyone holding it can also seal a forgery, so this is the operator's own check,
731
+ not a stranger's. The command below puts the key on the command line; run it
732
+ only on a machine you control:
694
733
 
695
734
  ```bash
696
- python verifiers/verify_proof.py proof.json --hmac-key-hex <hex>
735
+ python "$VERIFY_PROOF" proof.json \
736
+ --hmac-key-hex "$(python -c "import pathlib; print(pathlib.Path('.cce/secrets/signing.key').read_bytes().hex())")"
697
737
  # VALID C1:P C2:P C3:P C4:P C5:S proof.json
698
738
  ```
699
739
 
@@ -703,7 +743,7 @@ Reaching `VALID` as a stranger requires the fingerprint from somewhere other
703
743
  than the artifact:
704
744
 
705
745
  ```bash
706
- python verifiers/verify_proof.py proof.json --fingerprint sha256:...
746
+ python "$VERIFY_PROOF" proof.json --fingerprint sha256:...
707
747
  ```
708
748
 
709
749
  The verifier's input boundary is deliberately finite. One invocation accepts
@@ -728,8 +768,9 @@ and `INVALID` dominates — a batch containing both an `INVALID` and an
728
768
  Check that the reference implementation still agrees with the corpus:
729
769
 
730
770
  ```bash
771
+ # from the checkout
731
772
  python vectors/generate.py --check
732
- # reference agrees with every committed vector
773
+ # reference agrees with all 50 committed vectors
733
774
  ```
734
775
 
735
776
  ## What this does not do
@@ -864,6 +905,9 @@ condition.
864
905
  - [docs/PUBLIC-FLIP.md](docs/PUBLIC-FLIP.md) — the register of every control
865
906
  that could not be enabled while this repository was private, with the exact
866
907
  command that turned each one on at the flip.
908
+ - [docs/MCP.md](docs/MCP.md) — connecting an agent over MCP, walked end to end on
909
+ this repository: install, init, ingest real events, confirm, verify, packet, check,
910
+ client configuration, and the freshness rule.
867
911
  - [docs/RELEASE.md](docs/RELEASE.md) — the reproducible, signed, immutable-ready
868
912
  release procedure and its continuity-bound attestation roadmap.
869
913
  - [docs/RESEARCH-ROADMAP.md](docs/RESEARCH-ROADMAP.md) — standards-backed
@@ -7,7 +7,7 @@ authenticated runtime records are not replay-derived (ADR-001). Storage is
7
7
  SQLite implementing the PostgreSQL-first relational adjacency design (ADR-011).
8
8
  """
9
9
 
10
- __version__ = "0.2.0"
10
+ __version__ = "0.4.0"
11
11
 
12
12
  SCHEMA_VERSIONS = {
13
13
  "anchor": "cce.anchor.v1",