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.
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/CONTRIBUTING.md +6 -2
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/scripts/check_attribution.py +12 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.pre-commit-config.yaml +1 -1
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/AGENTS.md +12 -5
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/CHANGELOG.md +55 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/CITATION.cff +2 -2
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/PKG-INFO +61 -17
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/README.md +59 -15
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/__init__.py +1 -1
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/engine.py +121 -6
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/extraction.py +100 -1
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/github.py +4 -2
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/invalidation.py +28 -5
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine.egg-info/PKG-INFO +61 -17
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine.egg-info/SOURCES.txt +5 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine.egg-info/requires.txt +1 -1
- causal_continuity_engine-0.4.0/docs/MCP.md +270 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/docs/RELEASE.md +3 -3
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/docs/REQUIREMENTS_COVERAGE.md +7 -7
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/docs/adr/ADR-INDEX.md +188 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/pyproject.toml +1 -1
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/requirements-dev.in +1 -1
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/requirements-dev.lock +19 -19
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_attribution_controls.py +39 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_authority_extraction.py +3 -3
- causal_continuity_engine-0.4.0/tests/test_contradiction_notice.py +347 -0
- causal_continuity_engine-0.4.0/tests/test_exact_author_association.py +90 -0
- causal_continuity_engine-0.4.0/tests/test_extraction_negated_cue.py +93 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_github_redaction.py +1 -1
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_isolated_review.py +6 -0
- causal_continuity_engine-0.4.0/tests/test_proof_rejection_reason.py +45 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_release_controls.py +25 -4
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.editorconfig +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.gitattributes +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.githooks/commit-msg +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.githooks/pre-commit +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/CODEOWNERS +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/ISSUE_TEMPLATE/feature.yml +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/SECURITY.md +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/SUPPORT.md +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/dependabot.yml +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/pull_request_template.md +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/release.yml +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/ruleset.README.md +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/ruleset.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/scripts/bootstrap_tools.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/scripts/build_distributions.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/scripts/check_clean.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/scripts/check_content_marks.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/scripts/check_release_metadata.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/scripts/check_release_tag.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/scripts/check_stdlib.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/scripts/prepare_release_tag.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/scripts/render_api_docs.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/scripts/run_gates.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/scripts/run_isolated_review.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/scripts/verify_distributions.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/scripts/verify_public_schemas.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/tag-ruleset.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/workflows/ci.yml +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/workflows/commit-signature-audit.yml +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/workflows/content-integrity-pr.yml +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/workflows/content-integrity.yml +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/workflows/dependency-review.yml +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/workflows/no-ai-attribution.yml +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/workflows/release.yml +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.github/workflows/secret-scan.yml +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.gitignore +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/.gitleaks.toml +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/LICENSE.txt +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/MANIFEST.in +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/NOTICE +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/SPEC.md +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/benchmarks/__init__.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/benchmarks/continuitybench/__init__.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/benchmarks/continuitybench/run.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/benchmarks/continuitybench/scenarios.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/api.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/capabilities.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/capsule.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/cli.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/core.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/evidence.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/graph.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/lamport.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/learning.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/mcp.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/memory.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/ontology.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/partial.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/policy.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/proof.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/py.typed +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/redaction.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/resume.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/store.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine/verifiers.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine.egg-info/dependency_links.txt +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine.egg-info/entry_points.txt +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/causal_continuity_engine.egg-info/top_level.txt +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/docs/API.md +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/docs/CAPABILITIES.md +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/docs/CONTENT-INGRESS-FIREWALL.md +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/docs/PUBLIC-FLIP.md +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/docs/REQUIREMENTS.md +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/docs/RESEARCH-ROADMAP.md +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/docs/TESTING.md +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/docs/V0.1.5-TRUST-CLOSURE.md +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/docs/assets/demo.svg +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/docs/assets/social-preview.png +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/examples/backfill_github.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/examples/quickstart.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/justfile +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/schemas/cce.anchor.v1.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/schemas/cce.capsule.v1.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/schemas/cce.capsule.v2.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/schemas/cce.continuity-receipt.v1.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/schemas/cce.continuity-receipt.v2.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/schemas/cce.event.v1.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/schemas/cce.proof-predicate.v1.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/schemas/cce.proof-predicate.v2.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/schemas/cce.proof.v1.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/schemas/cce.proof.v2.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/schemas/cce.recovery.v1.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/schemas/cce.resume.v1.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/schemas/cce.resume.v2.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/setup.cfg +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/__init__.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/authority_helpers.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/schema_validation.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_api_contract.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_authority_atomic_append.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_authority_cli.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_authority_consumers.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_authority_criticality.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_authority_producer.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_authority_read_reuse.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_authority_redteam.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_authority_withdrawal_classification.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_benchmark_authority.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_benchmark_cleanup.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_benchmark_runner.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_capsule_packet_clock.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_cli.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_conformance.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_content_marks.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_distribution_environment.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_engine_e2e.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_identity_compatibility.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_installed_contracts.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_installed_packet_bounds.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_instrument_validation.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_invalidation_resume.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_learning_partial_api.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_mcp_server.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_memory_extraction.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_obligation_boundaries.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_obligation_completeness.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_obligation_contract_repairs.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_packet_byte_bounds.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_packet_byte_transports.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_packet_complete_trust.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_packet_failure_boundaries.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_packet_scope_receipts.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_packet_scope_wire.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_packet_validity_frontier.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_processor_compatibility.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_proof_obligation_wire.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_readme_contract.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_receipt_spec_contract.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round10_release.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round11_deep_integrity.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round12_release_blockers.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round13_jcs.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round14_state_integrity.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round15_capsule_invalidation_github.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round15_public_boundaries.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round15_storage_boundaries.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round16_cli_api_core_capabilities.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round17_backfill_layout.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round18_assumption_edits.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round18_co_assertion.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round18_journal.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round18_negation.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round18_source_order.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round2.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round3.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round4.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round5.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round6.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round7.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round8_boundaries.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round8_engine.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round8_portability.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round8_state.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round9_integrity.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_regressions_round9_scope_freshness.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_release_boundary_validation.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_resume_prose_origin.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_schema_release_identities.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_sqlite_lifecycle.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_store_graph.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_task_packet_review.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_task_packets.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/tests/test_trust.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/action_intent_wrong_type.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/actor_wrong_type.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/created_at_invalid_calendar_date.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/created_at_leap_second.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/created_at_lowercase_designators.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/created_at_missing_timezone.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/created_at_noncanonical_offset.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/created_at_space_separator.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/empty_required_authoritative_failure.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/empty_required_authoritative_pass.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/empty_required_no_results.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/empty_required_self_asserted_pass.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/generate.py +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/historical_proof_version.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/incomplete_failed_check.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/index.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/input_item_wrong_type.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/invalid_result_value.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/lamport_fingerprint_spoof.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/lamport_no_registry.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/lamport_truncated_key.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/missing_required_field.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/non_binary64_integer.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/obligation_duplicate.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/obligation_duplicate_task.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/obligation_missing.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/obligation_wrong_kind.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/obligation_wrong_task.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/policy_decision_wrong_type.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/retry_cannot_launder_a_failure.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/self_asserted_cannot_satisfy.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/self_assertion_cannot_poison_authoritative_pass.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/status_contradicts_contents.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/summary_contradicts_contents.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/tamper_statement.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/tamper_statement_resealed.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/task_id_under_unrelated_field.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/unbound_task.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/unknown_action_intent_field.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/unknown_algorithm.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/unknown_evidence_context_field.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/unknown_execution_field.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/unknown_schema_version.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/unknown_top_level_field.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/unknown_verification_field.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/unverified_forged_body_no_key.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/unverified_hmac_no_key.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/valid_hmac.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/valid_hmac_jcs_edges.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/valid_hmac_unicode.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/valid_lamport.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/vectors/wrong_project.json +0 -0
- {causal_continuity_engine-0.2.0 → causal_continuity_engine-0.4.0}/verifiers/__init__.py +0 -0
- {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.
|
|
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:
|
|
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
|
|
18
|
-
|
|
19
|
-
|
|
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
|
|
329
|
-
|
|
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.
|
|
12
|
-
date-released: 2026-
|
|
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
|
+
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.
|
|
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
|
|
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.
|
|
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.
|
|
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
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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.
|
|
169
|
-
extractor 1.
|
|
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#
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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.
|
|
134
|
-
extractor 1.
|
|
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#
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
10
|
+
__version__ = "0.4.0"
|
|
11
11
|
|
|
12
12
|
SCHEMA_VERSIONS = {
|
|
13
13
|
"anchor": "cce.anchor.v1",
|