causal-continuity-engine 0.3.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.3.0 → causal_continuity_engine-0.4.0}/.github/CONTRIBUTING.md +1 -1
  2. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.pre-commit-config.yaml +1 -1
  3. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/CHANGELOG.md +21 -0
  4. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/CITATION.cff +2 -2
  5. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/PKG-INFO +42 -16
  6. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/README.md +40 -14
  7. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/__init__.py +1 -1
  8. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/engine.py +1 -1
  9. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/github.py +4 -2
  10. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine.egg-info/PKG-INFO +42 -16
  11. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine.egg-info/SOURCES.txt +1 -0
  12. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine.egg-info/requires.txt +1 -1
  13. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/docs/RELEASE.md +3 -3
  14. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/docs/REQUIREMENTS_COVERAGE.md +3 -3
  15. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/docs/adr/ADR-INDEX.md +54 -0
  16. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/pyproject.toml +1 -1
  17. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/requirements-dev.in +1 -1
  18. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/requirements-dev.lock +19 -19
  19. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_contradiction_notice.py +1 -0
  20. causal_continuity_engine-0.4.0/tests/test_exact_author_association.py +90 -0
  21. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_extraction_negated_cue.py +1 -1
  22. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_github_redaction.py +1 -1
  23. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_release_controls.py +3 -3
  24. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.editorconfig +0 -0
  25. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.gitattributes +0 -0
  26. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.githooks/commit-msg +0 -0
  27. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.githooks/pre-commit +0 -0
  28. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/CODEOWNERS +0 -0
  29. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
  30. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  31. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/ISSUE_TEMPLATE/feature.yml +0 -0
  32. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/SECURITY.md +0 -0
  33. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/SUPPORT.md +0 -0
  34. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/dependabot.yml +0 -0
  35. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/pull_request_template.md +0 -0
  36. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/release.yml +0 -0
  37. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/ruleset.README.md +0 -0
  38. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/ruleset.json +0 -0
  39. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/scripts/bootstrap_tools.py +0 -0
  40. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/scripts/build_distributions.py +0 -0
  41. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/scripts/check_attribution.py +0 -0
  42. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/scripts/check_clean.py +0 -0
  43. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/scripts/check_content_marks.py +0 -0
  44. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/scripts/check_release_metadata.py +0 -0
  45. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/scripts/check_release_tag.py +0 -0
  46. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/scripts/check_stdlib.py +0 -0
  47. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/scripts/prepare_release_tag.py +0 -0
  48. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/scripts/render_api_docs.py +0 -0
  49. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/scripts/run_gates.py +0 -0
  50. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/scripts/run_isolated_review.py +0 -0
  51. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/scripts/verify_distributions.py +0 -0
  52. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/scripts/verify_public_schemas.py +0 -0
  53. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/tag-ruleset.json +0 -0
  54. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/workflows/ci.yml +0 -0
  55. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/workflows/commit-signature-audit.yml +0 -0
  56. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/workflows/content-integrity-pr.yml +0 -0
  57. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/workflows/content-integrity.yml +0 -0
  58. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/workflows/dependency-review.yml +0 -0
  59. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/workflows/no-ai-attribution.yml +0 -0
  60. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/workflows/release.yml +0 -0
  61. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.github/workflows/secret-scan.yml +0 -0
  62. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.gitignore +0 -0
  63. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/.gitleaks.toml +0 -0
  64. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/AGENTS.md +0 -0
  65. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/LICENSE.txt +0 -0
  66. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/MANIFEST.in +0 -0
  67. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/NOTICE +0 -0
  68. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/SPEC.md +0 -0
  69. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/benchmarks/__init__.py +0 -0
  70. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/benchmarks/continuitybench/__init__.py +0 -0
  71. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/benchmarks/continuitybench/run.py +0 -0
  72. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/benchmarks/continuitybench/scenarios.py +0 -0
  73. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/api.py +0 -0
  74. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/capabilities.py +0 -0
  75. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/capsule.py +0 -0
  76. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/cli.py +0 -0
  77. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/core.py +0 -0
  78. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/evidence.py +0 -0
  79. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/extraction.py +0 -0
  80. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/graph.py +0 -0
  81. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/invalidation.py +0 -0
  82. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/lamport.py +0 -0
  83. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/learning.py +0 -0
  84. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/mcp.py +0 -0
  85. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/memory.py +0 -0
  86. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/ontology.py +0 -0
  87. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/partial.py +0 -0
  88. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/policy.py +0 -0
  89. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/proof.py +0 -0
  90. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/py.typed +0 -0
  91. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/redaction.py +0 -0
  92. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/resume.py +0 -0
  93. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/store.py +0 -0
  94. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/verifiers.py +0 -0
  95. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine.egg-info/dependency_links.txt +0 -0
  96. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine.egg-info/entry_points.txt +0 -0
  97. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine.egg-info/top_level.txt +0 -0
  98. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/docs/API.md +0 -0
  99. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/docs/CAPABILITIES.md +0 -0
  100. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/docs/CONTENT-INGRESS-FIREWALL.md +0 -0
  101. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/docs/MCP.md +0 -0
  102. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/docs/PUBLIC-FLIP.md +0 -0
  103. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/docs/REQUIREMENTS.md +0 -0
  104. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/docs/RESEARCH-ROADMAP.md +0 -0
  105. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/docs/TESTING.md +0 -0
  106. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/docs/V0.1.5-TRUST-CLOSURE.md +0 -0
  107. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/docs/assets/demo.svg +0 -0
  108. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/docs/assets/social-preview.png +0 -0
  109. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/examples/backfill_github.py +0 -0
  110. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/examples/quickstart.py +0 -0
  111. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/justfile +0 -0
  112. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/schemas/cce.anchor.v1.json +0 -0
  113. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/schemas/cce.capsule.v1.json +0 -0
  114. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/schemas/cce.capsule.v2.json +0 -0
  115. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/schemas/cce.continuity-receipt.v1.json +0 -0
  116. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/schemas/cce.continuity-receipt.v2.json +0 -0
  117. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/schemas/cce.event.v1.json +0 -0
  118. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/schemas/cce.proof-predicate.v1.json +0 -0
  119. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/schemas/cce.proof-predicate.v2.json +0 -0
  120. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/schemas/cce.proof.v1.json +0 -0
  121. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/schemas/cce.proof.v2.json +0 -0
  122. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/schemas/cce.recovery.v1.json +0 -0
  123. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/schemas/cce.resume.v1.json +0 -0
  124. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/schemas/cce.resume.v2.json +0 -0
  125. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/setup.cfg +0 -0
  126. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/__init__.py +0 -0
  127. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/authority_helpers.py +0 -0
  128. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/schema_validation.py +0 -0
  129. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_api_contract.py +0 -0
  130. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_attribution_controls.py +0 -0
  131. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_authority_atomic_append.py +0 -0
  132. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_authority_cli.py +0 -0
  133. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_authority_consumers.py +0 -0
  134. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_authority_criticality.py +0 -0
  135. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_authority_extraction.py +0 -0
  136. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_authority_producer.py +0 -0
  137. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_authority_read_reuse.py +0 -0
  138. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_authority_redteam.py +0 -0
  139. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_authority_withdrawal_classification.py +0 -0
  140. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_benchmark_authority.py +0 -0
  141. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_benchmark_cleanup.py +0 -0
  142. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_benchmark_runner.py +0 -0
  143. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_capsule_packet_clock.py +0 -0
  144. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_cli.py +0 -0
  145. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_conformance.py +0 -0
  146. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_content_marks.py +0 -0
  147. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_distribution_environment.py +0 -0
  148. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_engine_e2e.py +0 -0
  149. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_identity_compatibility.py +0 -0
  150. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_installed_contracts.py +0 -0
  151. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_installed_packet_bounds.py +0 -0
  152. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_instrument_validation.py +0 -0
  153. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_invalidation_resume.py +0 -0
  154. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_isolated_review.py +0 -0
  155. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_learning_partial_api.py +0 -0
  156. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_mcp_server.py +0 -0
  157. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_memory_extraction.py +0 -0
  158. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_obligation_boundaries.py +0 -0
  159. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_obligation_completeness.py +0 -0
  160. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_obligation_contract_repairs.py +0 -0
  161. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_packet_byte_bounds.py +0 -0
  162. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_packet_byte_transports.py +0 -0
  163. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_packet_complete_trust.py +0 -0
  164. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_packet_failure_boundaries.py +0 -0
  165. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_packet_scope_receipts.py +0 -0
  166. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_packet_scope_wire.py +0 -0
  167. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_packet_validity_frontier.py +0 -0
  168. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_processor_compatibility.py +0 -0
  169. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_proof_obligation_wire.py +0 -0
  170. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_proof_rejection_reason.py +0 -0
  171. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_readme_contract.py +0 -0
  172. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_receipt_spec_contract.py +0 -0
  173. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_regressions.py +0 -0
  174. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round10_release.py +0 -0
  175. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round11_deep_integrity.py +0 -0
  176. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round12_release_blockers.py +0 -0
  177. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round13_jcs.py +0 -0
  178. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round14_state_integrity.py +0 -0
  179. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round15_capsule_invalidation_github.py +0 -0
  180. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round15_public_boundaries.py +0 -0
  181. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round15_storage_boundaries.py +0 -0
  182. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round16_cli_api_core_capabilities.py +0 -0
  183. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round17_backfill_layout.py +0 -0
  184. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round18_assumption_edits.py +0 -0
  185. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round18_co_assertion.py +0 -0
  186. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round18_journal.py +0 -0
  187. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round18_negation.py +0 -0
  188. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round18_source_order.py +0 -0
  189. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round2.py +0 -0
  190. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round3.py +0 -0
  191. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round4.py +0 -0
  192. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round5.py +0 -0
  193. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round6.py +0 -0
  194. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round7.py +0 -0
  195. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round8_boundaries.py +0 -0
  196. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round8_engine.py +0 -0
  197. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round8_portability.py +0 -0
  198. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round8_state.py +0 -0
  199. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round9_integrity.py +0 -0
  200. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round9_scope_freshness.py +0 -0
  201. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_release_boundary_validation.py +0 -0
  202. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_resume_prose_origin.py +0 -0
  203. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_schema_release_identities.py +0 -0
  204. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_sqlite_lifecycle.py +0 -0
  205. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_store_graph.py +0 -0
  206. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_task_packet_review.py +0 -0
  207. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_task_packets.py +0 -0
  208. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/tests/test_trust.py +0 -0
  209. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/action_intent_wrong_type.json +0 -0
  210. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/actor_wrong_type.json +0 -0
  211. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/created_at_invalid_calendar_date.json +0 -0
  212. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/created_at_leap_second.json +0 -0
  213. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/created_at_lowercase_designators.json +0 -0
  214. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/created_at_missing_timezone.json +0 -0
  215. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/created_at_noncanonical_offset.json +0 -0
  216. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/created_at_space_separator.json +0 -0
  217. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/empty_required_authoritative_failure.json +0 -0
  218. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/empty_required_authoritative_pass.json +0 -0
  219. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/empty_required_no_results.json +0 -0
  220. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/empty_required_self_asserted_pass.json +0 -0
  221. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/generate.py +0 -0
  222. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/historical_proof_version.json +0 -0
  223. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/incomplete_failed_check.json +0 -0
  224. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/index.json +0 -0
  225. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/input_item_wrong_type.json +0 -0
  226. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/invalid_result_value.json +0 -0
  227. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/lamport_fingerprint_spoof.json +0 -0
  228. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/lamport_no_registry.json +0 -0
  229. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/lamport_truncated_key.json +0 -0
  230. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/missing_required_field.json +0 -0
  231. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/non_binary64_integer.json +0 -0
  232. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/obligation_duplicate.json +0 -0
  233. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/obligation_duplicate_task.json +0 -0
  234. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/obligation_missing.json +0 -0
  235. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/obligation_wrong_kind.json +0 -0
  236. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/obligation_wrong_task.json +0 -0
  237. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/policy_decision_wrong_type.json +0 -0
  238. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/retry_cannot_launder_a_failure.json +0 -0
  239. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/self_asserted_cannot_satisfy.json +0 -0
  240. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/self_assertion_cannot_poison_authoritative_pass.json +0 -0
  241. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/status_contradicts_contents.json +0 -0
  242. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/summary_contradicts_contents.json +0 -0
  243. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/tamper_statement.json +0 -0
  244. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/tamper_statement_resealed.json +0 -0
  245. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/task_id_under_unrelated_field.json +0 -0
  246. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/unbound_task.json +0 -0
  247. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/unknown_action_intent_field.json +0 -0
  248. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/unknown_algorithm.json +0 -0
  249. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/unknown_evidence_context_field.json +0 -0
  250. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/unknown_execution_field.json +0 -0
  251. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/unknown_schema_version.json +0 -0
  252. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/unknown_top_level_field.json +0 -0
  253. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/unknown_verification_field.json +0 -0
  254. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/unverified_forged_body_no_key.json +0 -0
  255. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/unverified_hmac_no_key.json +0 -0
  256. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/valid_hmac.json +0 -0
  257. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/valid_hmac_jcs_edges.json +0 -0
  258. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/valid_hmac_unicode.json +0 -0
  259. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/valid_lamport.json +0 -0
  260. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/vectors/wrong_project.json +0 -0
  261. {causal_continuity_engine-0.3.0 → causal_continuity_engine-0.4.0}/verifiers/__init__.py +0 -0
  262. {causal_continuity_engine-0.3.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
 
@@ -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
@@ -9,6 +9,27 @@ 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
+
12
33
  ## 0.3.0 — 2026-10-16
13
34
 
14
35
  ### Added
@@ -8,8 +8,8 @@ authors:
8
8
  - given-names: Thomas
9
9
  family-names: Albrecht
10
10
  alias: The Quantum Falcon
11
- version: 0.3.0
12
- date-released: 2026-10-16
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.3.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"
@@ -145,9 +145,11 @@ than the official SDK, which would pull in more than twenty packages.
145
145
 
146
146
  ## Quickstart
147
147
 
148
- The installation commands below install the package PyPI currently serves; to
149
- run this exact checkout, including its authority and v2 packet examples, use
150
- 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.
151
153
 
152
154
  Python 3.11 or newer is required; the engine has no third-party runtime
153
155
  dependencies. Choose the block for your platform and run it in a new working
@@ -174,15 +176,15 @@ with `.\.venv\Scripts\python.exe -m pip install causal-continuity-engine`
174
176
  and invoke the environment's `cce-engine.exe` by its absolute path in the
175
177
  commands below. After activation, `cce-engine --help` checks the installation.
176
178
 
177
- **Upgrading an existing project:** this release uses processor 1.10.0 and
178
- extractor 1.5.0; projections written by 0.2.0's processor 1.9.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
179
181
  processors are refused. There is no in-place projection or authority upgrade. Stop writers,
180
182
  preserve the complete old project state (including its database and any SQLite
181
183
  sidecars), and re-ingest retained sources into a separate new project/store.
182
184
  Review and explicitly confirm the new proposals there; old prose is not approval.
183
185
  Do not remove markers or sidecars to bypass refusal. Payloads already removed
184
186
  by retention cannot be reconstructed from their digests. New users can simply
185
- start a fresh project. See [the upgrade notes for this release](CHANGELOG.md#030--2026-10-16);
187
+ start a fresh project. See [the upgrade notes for this release](CHANGELOG.md#040--2026-10-17);
186
188
  the [0.1.6 notes](CHANGELOG.md#016--2026-09-20) remain historical.
187
189
 
188
190
  To run this exact checkout instead of the published package, or to work on the
@@ -198,13 +200,20 @@ python -m pip install -e .
198
200
  ```
199
201
 
200
202
  On Windows, use the PowerShell environment-creation and activation commands
201
- 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.
202
206
 
203
207
  The editable install is enough for the engine but not for the test suite,
204
208
  which fails at collection without the hash-locked development tools. Install
205
209
  them with `python -m pip install -r requirements-dev.lock` (or `just setup`),
206
- then run `python -m pytest tests -q`. The full suite can take around fifteen
207
- minutes.
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.
208
217
 
209
218
  Global flags come **before** the subcommand: `cce-engine --dir <path> <subcommand>`.
210
219
 
@@ -406,6 +415,8 @@ Response: cli-markdown | max bytes: 131072
406
415
  The full human view renders each schema field or declares it as metadata kept
407
416
  in canonical JSON. Use `resume --format json` for those complete canonical
408
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_...)`).
409
420
 
410
421
  The named verification gap is expected on a fresh project: proof is required
411
422
  by default, but CCE cannot safely invent a project-specific verifier
@@ -722,10 +733,17 @@ Published v1 schemas remain historical contracts; v1 proofs are not current
722
733
  completion evidence. The v2 schema URLs are bound to the `v0.2.0` release tag,
723
734
  and the release workflow verifies that each serves the checked-out bytes.
724
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
+
725
741
  ```bash
726
742
  # The complete configured verifier set must already be pinned in project policy.
727
743
  cce-engine --dir . --json verify > proof.json
728
- 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
729
747
  ```
730
748
 
731
749
  ```text
@@ -733,6 +751,8 @@ UNVERIFIED means nothing was established, not that nothing is wrong.
733
751
  An hmac-sha256 envelope needs --hmac-key-hex; a lamport envelope needs --fingerprint
734
752
  from a source other than the envelope itself.
735
753
  UNVERIFIED C1:P C2:S C3:S C4:P C5:S proof.json
754
+
755
+ 1 UNVERIFIED
736
756
  ```
737
757
 
738
758
  **That verdict is the honest one, and it is the point.** `hmac-sha256` is not
@@ -740,10 +760,15 @@ a third-party-verifiable scheme at all. Without the secret, an untouched
740
760
  envelope and a resealed forgery are indistinguishable, so the verifier reports
741
761
  `UNVERIFIED` — not `VALID` — and exits 2. A verifier that returned `VALID`
742
762
  there would be telling a stranger that a body a forger rewrote and resealed is
743
- 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:
744
768
 
745
769
  ```bash
746
- 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())")"
747
772
  # VALID C1:P C2:P C3:P C4:P C5:S proof.json
748
773
  ```
749
774
 
@@ -753,7 +778,7 @@ Reaching `VALID` as a stranger requires the fingerprint from somewhere other
753
778
  than the artifact:
754
779
 
755
780
  ```bash
756
- python verifiers/verify_proof.py proof.json --fingerprint sha256:...
781
+ python "$VERIFY_PROOF" proof.json --fingerprint sha256:...
757
782
  ```
758
783
 
759
784
  The verifier's input boundary is deliberately finite. One invocation accepts
@@ -778,8 +803,9 @@ and `INVALID` dominates — a batch containing both an `INVALID` and an
778
803
  Check that the reference implementation still agrees with the corpus:
779
804
 
780
805
  ```bash
806
+ # from the checkout
781
807
  python vectors/generate.py --check
782
- # reference agrees with every committed vector
808
+ # reference agrees with all 50 committed vectors
783
809
  ```
784
810
 
785
811
  ## What this does not do
@@ -110,9 +110,11 @@ than the official SDK, which would pull in more than twenty packages.
110
110
 
111
111
  ## Quickstart
112
112
 
113
- The installation commands below install the package PyPI currently serves; to
114
- run this exact checkout, including its authority and v2 packet examples, use
115
- 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.
116
118
 
117
119
  Python 3.11 or newer is required; the engine has no third-party runtime
118
120
  dependencies. Choose the block for your platform and run it in a new working
@@ -139,15 +141,15 @@ with `.\.venv\Scripts\python.exe -m pip install causal-continuity-engine`
139
141
  and invoke the environment's `cce-engine.exe` by its absolute path in the
140
142
  commands below. After activation, `cce-engine --help` checks the installation.
141
143
 
142
- **Upgrading an existing project:** this release uses processor 1.10.0 and
143
- extractor 1.5.0; projections written by 0.2.0's processor 1.9.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
144
146
  processors are refused. There is no in-place projection or authority upgrade. Stop writers,
145
147
  preserve the complete old project state (including its database and any SQLite
146
148
  sidecars), and re-ingest retained sources into a separate new project/store.
147
149
  Review and explicitly confirm the new proposals there; old prose is not approval.
148
150
  Do not remove markers or sidecars to bypass refusal. Payloads already removed
149
151
  by retention cannot be reconstructed from their digests. New users can simply
150
- start a fresh project. See [the upgrade notes for this release](CHANGELOG.md#030--2026-10-16);
152
+ start a fresh project. See [the upgrade notes for this release](CHANGELOG.md#040--2026-10-17);
151
153
  the [0.1.6 notes](CHANGELOG.md#016--2026-09-20) remain historical.
152
154
 
153
155
  To run this exact checkout instead of the published package, or to work on the
@@ -163,13 +165,20 @@ python -m pip install -e .
163
165
  ```
164
166
 
165
167
  On Windows, use the PowerShell environment-creation and activation commands
166
- 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.
167
171
 
168
172
  The editable install is enough for the engine but not for the test suite,
169
173
  which fails at collection without the hash-locked development tools. Install
170
174
  them with `python -m pip install -r requirements-dev.lock` (or `just setup`),
171
- then run `python -m pytest tests -q`. The full suite can take around fifteen
172
- minutes.
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.
173
182
 
174
183
  Global flags come **before** the subcommand: `cce-engine --dir <path> <subcommand>`.
175
184
 
@@ -371,6 +380,8 @@ Response: cli-markdown | max bytes: 131072
371
380
  The full human view renders each schema field or declares it as metadata kept
372
381
  in canonical JSON. Use `resume --format json` for those complete canonical
373
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_...)`).
374
385
 
375
386
  The named verification gap is expected on a fresh project: proof is required
376
387
  by default, but CCE cannot safely invent a project-specific verifier
@@ -687,10 +698,17 @@ Published v1 schemas remain historical contracts; v1 proofs are not current
687
698
  completion evidence. The v2 schema URLs are bound to the `v0.2.0` release tag,
688
699
  and the release workflow verifies that each serves the checked-out bytes.
689
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
+
690
706
  ```bash
691
707
  # The complete configured verifier set must already be pinned in project policy.
692
708
  cce-engine --dir . --json verify > proof.json
693
- 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
694
712
  ```
695
713
 
696
714
  ```text
@@ -698,6 +716,8 @@ UNVERIFIED means nothing was established, not that nothing is wrong.
698
716
  An hmac-sha256 envelope needs --hmac-key-hex; a lamport envelope needs --fingerprint
699
717
  from a source other than the envelope itself.
700
718
  UNVERIFIED C1:P C2:S C3:S C4:P C5:S proof.json
719
+
720
+ 1 UNVERIFIED
701
721
  ```
702
722
 
703
723
  **That verdict is the honest one, and it is the point.** `hmac-sha256` is not
@@ -705,10 +725,15 @@ a third-party-verifiable scheme at all. Without the secret, an untouched
705
725
  envelope and a resealed forgery are indistinguishable, so the verifier reports
706
726
  `UNVERIFIED` — not `VALID` — and exits 2. A verifier that returned `VALID`
707
727
  there would be telling a stranger that a body a forger rewrote and resealed is
708
- 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:
709
733
 
710
734
  ```bash
711
- 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())")"
712
737
  # VALID C1:P C2:P C3:P C4:P C5:S proof.json
713
738
  ```
714
739
 
@@ -718,7 +743,7 @@ Reaching `VALID` as a stranger requires the fingerprint from somewhere other
718
743
  than the artifact:
719
744
 
720
745
  ```bash
721
- python verifiers/verify_proof.py proof.json --fingerprint sha256:...
746
+ python "$VERIFY_PROOF" proof.json --fingerprint sha256:...
722
747
  ```
723
748
 
724
749
  The verifier's input boundary is deliberately finite. One invocation accepts
@@ -743,8 +768,9 @@ and `INVALID` dominates — a batch containing both an `INVALID` and an
743
768
  Check that the reference implementation still agrees with the corpus:
744
769
 
745
770
  ```bash
771
+ # from the checkout
746
772
  python vectors/generate.py --check
747
- # reference agrees with every committed vector
773
+ # reference agrees with all 50 committed vectors
748
774
  ```
749
775
 
750
776
  ## What this does not do
@@ -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.3.0"
10
+ __version__ = "0.4.0"
11
11
 
12
12
  SCHEMA_VERSIONS = {
13
13
  "anchor": "cce.anchor.v1",
@@ -104,7 +104,7 @@ from .store import (
104
104
  )
105
105
  from .verifiers import VerifierRunner, VerifierSpec, record_verification
106
106
 
107
- PROCESSOR_VERSION = "cce-processor/1.10.0"
107
+ PROCESSOR_VERSION = "cce-processor/1.11.0"
108
108
  _AUTHORITY_SCHEMA = "cce.authority-decision.v1"
109
109
  _AUTHORITY_SOURCE = "cce:authority-decision:v1"
110
110
  _AUTHORITY_EXTRACTOR = "cce.authority-decision"
@@ -65,10 +65,12 @@ def text_authority(author_association: str | None) -> str:
65
65
  """Source authority for text authored by a GitHub account.
66
66
 
67
67
  An issue or comment body is evidence about intent, never policy — and
68
- whose intent it is decides how much weight it carries.
68
+ whose intent it is decides how much weight it carries. GitHub sends the
69
+ association in upper case; any other spelling is not a GitHub value and
70
+ stays untrusted, exactly as command authorization compares it (ADR-134).
69
71
  """
70
72
  if (isinstance(author_association, str)
71
- and author_association.upper() in TRUSTED_ASSOCIATIONS):
73
+ and author_association in TRUSTED_ASSOCIATIONS):
72
74
  return "human_intent"
73
75
  return "untrusted_content"
74
76
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: causal-continuity-engine
3
- Version: 0.3.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"
@@ -145,9 +145,11 @@ than the official SDK, which would pull in more than twenty packages.
145
145
 
146
146
  ## Quickstart
147
147
 
148
- The installation commands below install the package PyPI currently serves; to
149
- run this exact checkout, including its authority and v2 packet examples, use
150
- 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.
151
153
 
152
154
  Python 3.11 or newer is required; the engine has no third-party runtime
153
155
  dependencies. Choose the block for your platform and run it in a new working
@@ -174,15 +176,15 @@ with `.\.venv\Scripts\python.exe -m pip install causal-continuity-engine`
174
176
  and invoke the environment's `cce-engine.exe` by its absolute path in the
175
177
  commands below. After activation, `cce-engine --help` checks the installation.
176
178
 
177
- **Upgrading an existing project:** this release uses processor 1.10.0 and
178
- extractor 1.5.0; projections written by 0.2.0's processor 1.9.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
179
181
  processors are refused. There is no in-place projection or authority upgrade. Stop writers,
180
182
  preserve the complete old project state (including its database and any SQLite
181
183
  sidecars), and re-ingest retained sources into a separate new project/store.
182
184
  Review and explicitly confirm the new proposals there; old prose is not approval.
183
185
  Do not remove markers or sidecars to bypass refusal. Payloads already removed
184
186
  by retention cannot be reconstructed from their digests. New users can simply
185
- start a fresh project. See [the upgrade notes for this release](CHANGELOG.md#030--2026-10-16);
187
+ start a fresh project. See [the upgrade notes for this release](CHANGELOG.md#040--2026-10-17);
186
188
  the [0.1.6 notes](CHANGELOG.md#016--2026-09-20) remain historical.
187
189
 
188
190
  To run this exact checkout instead of the published package, or to work on the
@@ -198,13 +200,20 @@ python -m pip install -e .
198
200
  ```
199
201
 
200
202
  On Windows, use the PowerShell environment-creation and activation commands
201
- 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.
202
206
 
203
207
  The editable install is enough for the engine but not for the test suite,
204
208
  which fails at collection without the hash-locked development tools. Install
205
209
  them with `python -m pip install -r requirements-dev.lock` (or `just setup`),
206
- then run `python -m pytest tests -q`. The full suite can take around fifteen
207
- minutes.
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.
208
217
 
209
218
  Global flags come **before** the subcommand: `cce-engine --dir <path> <subcommand>`.
210
219
 
@@ -406,6 +415,8 @@ Response: cli-markdown | max bytes: 131072
406
415
  The full human view renders each schema field or declares it as metadata kept
407
416
  in canonical JSON. Use `resume --format json` for those complete canonical
408
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_...)`).
409
420
 
410
421
  The named verification gap is expected on a fresh project: proof is required
411
422
  by default, but CCE cannot safely invent a project-specific verifier
@@ -722,10 +733,17 @@ Published v1 schemas remain historical contracts; v1 proofs are not current
722
733
  completion evidence. The v2 schema URLs are bound to the `v0.2.0` release tag,
723
734
  and the release workflow verifies that each serves the checked-out bytes.
724
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
+
725
741
  ```bash
726
742
  # The complete configured verifier set must already be pinned in project policy.
727
743
  cce-engine --dir . --json verify > proof.json
728
- 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
729
747
  ```
730
748
 
731
749
  ```text
@@ -733,6 +751,8 @@ UNVERIFIED means nothing was established, not that nothing is wrong.
733
751
  An hmac-sha256 envelope needs --hmac-key-hex; a lamport envelope needs --fingerprint
734
752
  from a source other than the envelope itself.
735
753
  UNVERIFIED C1:P C2:S C3:S C4:P C5:S proof.json
754
+
755
+ 1 UNVERIFIED
736
756
  ```
737
757
 
738
758
  **That verdict is the honest one, and it is the point.** `hmac-sha256` is not
@@ -740,10 +760,15 @@ a third-party-verifiable scheme at all. Without the secret, an untouched
740
760
  envelope and a resealed forgery are indistinguishable, so the verifier reports
741
761
  `UNVERIFIED` — not `VALID` — and exits 2. A verifier that returned `VALID`
742
762
  there would be telling a stranger that a body a forger rewrote and resealed is
743
- 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:
744
768
 
745
769
  ```bash
746
- 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())")"
747
772
  # VALID C1:P C2:P C3:P C4:P C5:S proof.json
748
773
  ```
749
774
 
@@ -753,7 +778,7 @@ Reaching `VALID` as a stranger requires the fingerprint from somewhere other
753
778
  than the artifact:
754
779
 
755
780
  ```bash
756
- python verifiers/verify_proof.py proof.json --fingerprint sha256:...
781
+ python "$VERIFY_PROOF" proof.json --fingerprint sha256:...
757
782
  ```
758
783
 
759
784
  The verifier's input boundary is deliberately finite. One invocation accepts
@@ -778,8 +803,9 @@ and `INVALID` dominates — a batch containing both an `INVALID` and an
778
803
  Check that the reference implementation still agrees with the corpus:
779
804
 
780
805
  ```bash
806
+ # from the checkout
781
807
  python vectors/generate.py --check
782
- # reference agrees with every committed vector
808
+ # reference agrees with all 50 committed vectors
783
809
  ```
784
810
 
785
811
  ## What this does not do
@@ -140,6 +140,7 @@ tests/test_content_marks.py
140
140
  tests/test_contradiction_notice.py
141
141
  tests/test_distribution_environment.py
142
142
  tests/test_engine_e2e.py
143
+ tests/test_exact_author_association.py
143
144
  tests/test_extraction_negated_cue.py
144
145
  tests/test_github_redaction.py
145
146
  tests/test_identity_compatibility.py
@@ -1,7 +1,7 @@
1
1
 
2
2
  [dev]
3
3
  pytest==9.1.1
4
- ruff==0.16.7
4
+ ruff==0.16.10
5
5
  build==1.6.1
6
6
  jsonschema==4.26.0
7
7
  pip==26.2.1
@@ -43,9 +43,9 @@ which maintainer signed.
43
43
 
44
44
  ## Prepare the tree
45
45
 
46
- Processor 1.10.0 and extractor 1.5.0 are not an in-place projection upgrade.
46
+ Processor 1.11.0 and extractor 1.5.0 are not an in-place projection upgrade.
47
47
  Stop writers and preserve each complete older database with its SQLite
48
- sidecars, including processor 1.9.0 stores. Re-ingest retained sources into a
48
+ sidecars, including processor 1.10.0 stores. Re-ingest retained sources into a
49
49
  distinct current store/project (ADR-114, ADR-126). Review the
50
50
  new source-event-bound proposals and explicitly confirm the intended statements
51
51
  and global or confirmed-task scopes through the local authority producer.
@@ -87,7 +87,7 @@ omits `date-released`.
87
87
  and its negative fixtures; the test gate fails otherwise.
88
88
  2. Regenerate `docs/CAPABILITIES.md` only with
89
89
  `python -m causal_continuity_engine.capabilities --write`.
90
- 3. Run `python .github/scripts/check_release_metadata.py --release v0.3.0`,
90
+ 3. Run `python .github/scripts/check_release_metadata.py --release v0.4.0`,
91
91
  then `just setup` and `just release` from a clean checkout.
92
92
  Release-mode metadata checking refuses while the heading is undated.
93
93
  4. Drive the MCP server by hand from the built wheel with a real client, and
@@ -1,7 +1,7 @@
1
1
  # Requirement Coverage — CCE reference implementation
2
2
 
3
- This matrix describes version 0.3.0. It is a narrative status record, not a
4
- claim that artifact or platform gates have run. Processor 1.10.0 refuses older
3
+ This matrix describes version 0.4.0. It is a narrative status record, not a
4
+ claim that artifact or platform gates have run. Processor 1.11.0 refuses older
5
5
  projections: preserve those stores, re-ingest retained inputs into a distinct
6
6
  current store/project, then review and explicitly confirm new proposals.
7
7
  Payloads already removed by retention cannot be reconstructed (ADR-114, ADR-126).
@@ -57,7 +57,7 @@ Status legend:
57
57
  | AD-003 | implemented | scope/criticality/confidence/authority/valid-time on every node |
58
58
  | AD-004 | implemented | current prose proposals use `cce.proposal-id.v1`, binding tenant/project, canonical source event, source identity/field, proposed kind and exact retained text; confirmation has a distinct canonical-decision identity. Older normalized statement identities retain compatibility checks but are not current proposal authority (ADR-126; `test_authority_extraction.py`, `test_authority_producer.py`). |
59
59
  | AD-005 | implemented | status resolution is versioned but cannot grant prose authority. Owner-local `record_authority_decision` and `authority --request FILE` provide closed confirm/revoke/replace_scope/confirm_invalidation/reject_invalidation operations with canonical operand checks; HTTP/MCP expose no confirmation producer (ADR-126). |
60
- | AD-006 | implemented | source typing and injection quarantine precede extraction. All prose, including OWNER and human-decision prose, proposes rather than mandates; explicit local confirmation is required (`test_authority_extraction.py`, `test_authority_consumers.py`; ADR-126). |
60
+ | AD-006 | implemented | source typing and injection quarantine precede extraction. All prose, including OWNER and human-decision prose, proposes rather than mandates; explicit local confirmation is required (`test_authority_extraction.py`, `test_authority_consumers.py`; ADR-126). A GitHub association types text as maintainer intent only in GitHub's exact spelling, as command authorization compares it (`test_exact_author_association.py`; ADR-134). |
61
61
  | AD-007 | implemented | calibration by source authority + abstention gate |
62
62
  | AD-008 | partial | assumes/depends_on edges supported; automatic linking only where extraction sees both ends |
63
63
 
@@ -3634,3 +3634,57 @@ not make it. A trusted author's stray "not" raises a notice that blocks
3634
3634
  completion of touched tasks until rejected, which is the human gate working.
3635
3635
  The packet summary shows the target and recommended action, not the sentence;
3636
3636
  `invalidations --explain` and MCP `list_invalidations` show the reason.
3637
+
3638
+ ## ADR-134 — A GitHub author association is trusted only in GitHub's exact spelling
3639
+
3640
+ **Status.** Accepted for the local next-version candidate, 2026-10-16;
3641
+ not published.
3642
+
3643
+ **Context.** `text_authority` upper-cased `author_association` before
3644
+ comparing it with OWNER, MEMBER and COLLABORATOR, and a test pinned that
3645
+ `owner` counted as maintainer intent. Command authorization (GHI-005)
3646
+ compared the same field exactly, so one payload could be trusted for its prose
3647
+ and refused for its command. A reproduction run of the ADR-133 notice showed
3648
+ the effect: a comment whose association was `owner` raised a
3649
+ `contradictory_evidence` notice, while `OWNER ` with a trailing space did not.
3650
+ GitHub sends only upper-case association values, so the lenient path served
3651
+ no webhook input; it only widened what a hand-made or replayed payload could
3652
+ claim.
3653
+
3654
+ **Decision.** `text_authority` returns `human_intent` only when the
3655
+ association is a string exactly equal to OWNER, MEMBER or COLLABORATOR; every
3656
+ other value, including other spellings of those three, is
3657
+ `untrusted_content`. Text authority and command authorization now compare the
3658
+ same set the same way. Untrusted text is still extracted, screened and
3659
+ proposed as before; it cannot mandate, cannot raise an ADR-133 notice and
3660
+ cannot run a command.
3661
+
3662
+ **Alternatives.** Documenting the case-insensitive comparison would keep two
3663
+ answers to one question in the engine. Normalizing at ingestion would rewrite
3664
+ a retained source field. Refusing the whole event for a non-GitHub spelling
3665
+ would turn a typing decision into a rejection of evidence that untrusted
3666
+ typing already contains.
3667
+
3668
+ **Compatibility.** Replay re-normalizes each retained payload, so a retained
3669
+ event whose association differs from GitHub's spelling now types differently.
3670
+ The processor identity advances from `cce-processor/1.10.0` to
3671
+ `cce-processor/1.11.0`; `cce-deterministic` stays 1.5.0 because extraction is
3672
+ unchanged. Stores projected by 1.10.0 or earlier are refused under ADR-114:
3673
+ preserve them with their SQLite sidecars and re-ingest retained sources into a
3674
+ distinct new store/project, then review and confirm its proposals. Webhook
3675
+ data from GitHub projects identically.
3676
+
3677
+ **Verification.** The three GitHub spellings type issue, comment, pull-request
3678
+ and review text as `human_intent`; ten other spellings, among them `owner`,
3679
+ `Member` and `OWNER ` with a trailing space, type all four as
3680
+ `untrusted_content`, and non-text values are untrusted without raising. Text
3681
+ trust and command authorization agree on every tested value. `owner`,
3682
+ `Member` and `OWNER ` comments raise no ADR-133 notice while the upper-case
3683
+ associations still raise one. The processor identity is pinned. The deciding
3684
+ tests fail against processor 1.10.0.
3685
+
3686
+ **Limit.** This decides how a value is compared, not whether it is true.
3687
+ Anyone who can submit a payload chooses its association: HTTP ingestion
3688
+ trusts it only after webhook signature verification, and CLI ingestion is
3689
+ owner-local. Exact comparison removes a spelling GitHub never sends; it does
3690
+ not authenticate the author.