causal-continuity-engine 0.1.6__tar.gz → 0.2.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.1.6 → causal_continuity_engine-0.2.0}/.github/CONTRIBUTING.md +6 -5
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/scripts/verify_distributions.py +4 -1
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/scripts/verify_public_schemas.py +22 -4
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/AGENTS.md +11 -8
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/CHANGELOG.md +58 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/CITATION.cff +2 -2
- {causal_continuity_engine-0.1.6/causal_continuity_engine.egg-info → causal_continuity_engine-0.2.0}/PKG-INFO +189 -91
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/README.md +188 -90
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/SPEC.md +69 -15
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/benchmarks/continuitybench/run.py +4 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/benchmarks/continuitybench/scenarios.py +89 -40
- causal_continuity_engine-0.2.0/causal_continuity_engine/__init__.py +27 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/causal_continuity_engine/api.py +55 -16
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/causal_continuity_engine/capsule.py +122 -9
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/causal_continuity_engine/cli.py +78 -6
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/causal_continuity_engine/engine.py +908 -187
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/causal_continuity_engine/extraction.py +20 -16
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/causal_continuity_engine/graph.py +11 -1
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/causal_continuity_engine/invalidation.py +22 -11
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/causal_continuity_engine/mcp.py +79 -13
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/causal_continuity_engine/memory.py +20 -4
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/causal_continuity_engine/partial.py +2 -1
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/causal_continuity_engine/policy.py +9 -8
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/causal_continuity_engine/proof.py +44 -12
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/causal_continuity_engine/resume.py +281 -85
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/causal_continuity_engine/store.py +73 -10
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0/causal_continuity_engine.egg-info}/PKG-INFO +189 -91
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/causal_continuity_engine.egg-info/SOURCES.txt +43 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/docs/API.md +18 -5
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/docs/RELEASE.md +52 -16
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/docs/REQUIREMENTS_COVERAGE.md +18 -12
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/docs/adr/ADR-INDEX.md +572 -1
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/pyproject.toml +1 -1
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/requirements-dev.in +1 -1
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/requirements-dev.lock +3 -3
- causal_continuity_engine-0.2.0/schemas/cce.capsule.v2.json +232 -0
- causal_continuity_engine-0.2.0/schemas/cce.continuity-receipt.v2.json +787 -0
- causal_continuity_engine-0.2.0/schemas/cce.proof-predicate.v2.json +85 -0
- causal_continuity_engine-0.2.0/schemas/cce.proof.v2.json +565 -0
- causal_continuity_engine-0.2.0/schemas/cce.resume.v2.json +864 -0
- causal_continuity_engine-0.2.0/tests/authority_helpers.py +25 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_api_contract.py +12 -5
- causal_continuity_engine-0.2.0/tests/test_authority_atomic_append.py +418 -0
- causal_continuity_engine-0.2.0/tests/test_authority_cli.py +550 -0
- causal_continuity_engine-0.2.0/tests/test_authority_consumers.py +461 -0
- causal_continuity_engine-0.2.0/tests/test_authority_criticality.py +164 -0
- causal_continuity_engine-0.2.0/tests/test_authority_extraction.py +165 -0
- causal_continuity_engine-0.2.0/tests/test_authority_producer.py +203 -0
- causal_continuity_engine-0.2.0/tests/test_authority_read_reuse.py +252 -0
- causal_continuity_engine-0.2.0/tests/test_authority_redteam.py +293 -0
- causal_continuity_engine-0.2.0/tests/test_authority_withdrawal_classification.py +68 -0
- causal_continuity_engine-0.2.0/tests/test_benchmark_authority.py +91 -0
- causal_continuity_engine-0.2.0/tests/test_benchmark_cleanup.py +80 -0
- causal_continuity_engine-0.2.0/tests/test_capsule_packet_clock.py +124 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_cli.py +92 -2
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_conformance.py +4 -4
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_engine_e2e.py +164 -74
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_identity_compatibility.py +39 -37
- causal_continuity_engine-0.2.0/tests/test_installed_contracts.py +167 -0
- causal_continuity_engine-0.2.0/tests/test_installed_packet_bounds.py +95 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_instrument_validation.py +77 -20
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_invalidation_resume.py +67 -106
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_learning_partial_api.py +13 -4
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_mcp_server.py +34 -5
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_memory_extraction.py +60 -46
- causal_continuity_engine-0.2.0/tests/test_obligation_boundaries.py +149 -0
- causal_continuity_engine-0.2.0/tests/test_obligation_completeness.py +366 -0
- causal_continuity_engine-0.2.0/tests/test_obligation_contract_repairs.py +136 -0
- causal_continuity_engine-0.2.0/tests/test_packet_byte_bounds.py +431 -0
- causal_continuity_engine-0.2.0/tests/test_packet_byte_transports.py +331 -0
- causal_continuity_engine-0.2.0/tests/test_packet_complete_trust.py +42 -0
- causal_continuity_engine-0.2.0/tests/test_packet_failure_boundaries.py +36 -0
- causal_continuity_engine-0.2.0/tests/test_packet_scope_receipts.py +88 -0
- causal_continuity_engine-0.2.0/tests/test_packet_scope_wire.py +368 -0
- causal_continuity_engine-0.2.0/tests/test_packet_validity_frontier.py +200 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_processor_compatibility.py +14 -3
- causal_continuity_engine-0.2.0/tests/test_proof_obligation_wire.py +238 -0
- causal_continuity_engine-0.2.0/tests/test_readme_contract.py +100 -0
- causal_continuity_engine-0.2.0/tests/test_receipt_spec_contract.py +101 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_regressions.py +10 -3
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_regressions_round10_release.py +10 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_regressions_round11_deep_integrity.py +4 -9
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_regressions_round14_state_integrity.py +17 -6
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_regressions_round17_backfill_layout.py +8 -4
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_regressions_round18_assumption_edits.py +120 -76
- causal_continuity_engine-0.2.0/tests/test_regressions_round18_co_assertion.py +163 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_regressions_round18_negation.py +69 -28
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_regressions_round18_source_order.py +97 -18
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_regressions_round2.py +31 -36
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_regressions_round3.py +59 -12
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_regressions_round4.py +2 -3
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_regressions_round5.py +3 -4
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_regressions_round6.py +25 -20
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_regressions_round7.py +61 -42
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_regressions_round8_engine.py +32 -17
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_regressions_round8_portability.py +29 -18
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_regressions_round9_integrity.py +2 -3
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_release_boundary_validation.py +16 -4
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_release_controls.py +31 -26
- causal_continuity_engine-0.2.0/tests/test_resume_prose_origin.py +189 -0
- causal_continuity_engine-0.2.0/tests/test_schema_release_identities.py +136 -0
- causal_continuity_engine-0.2.0/tests/test_task_packet_review.py +215 -0
- causal_continuity_engine-0.2.0/tests/test_task_packets.py +369 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_trust.py +2 -3
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/action_intent_wrong_type.json +25 -20
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/actor_wrong_type.json +25 -20
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/created_at_invalid_calendar_date.json +24 -19
- causal_continuity_engine-0.2.0/vectors/created_at_leap_second.json +177 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/created_at_lowercase_designators.json +24 -19
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/created_at_missing_timezone.json +24 -19
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/created_at_noncanonical_offset.json +24 -19
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/created_at_space_separator.json +24 -19
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/empty_required_authoritative_failure.json +17 -12
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/empty_required_authoritative_pass.json +17 -12
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/empty_required_no_results.json +17 -12
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/empty_required_self_asserted_pass.json +17 -12
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/generate.py +48 -13
- causal_continuity_engine-0.2.0/vectors/historical_proof_version.json +177 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/incomplete_failed_check.json +24 -19
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/index.json +42 -0
- causal_continuity_engine-0.2.0/vectors/input_item_wrong_type.json +178 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/invalid_result_value.json +25 -20
- causal_continuity_engine-0.2.0/vectors/lamport_fingerprint_spoof.json +1463 -0
- causal_continuity_engine-0.2.0/vectors/lamport_no_registry.json +1459 -0
- causal_continuity_engine-0.2.0/vectors/lamport_truncated_key.json +1459 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/missing_required_field.json +25 -20
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/non_binary64_integer.json +25 -20
- causal_continuity_engine-0.2.0/vectors/obligation_duplicate.json +182 -0
- causal_continuity_engine-0.2.0/vectors/obligation_duplicate_task.json +178 -0
- causal_continuity_engine-0.1.6/vectors/created_at_leap_second.json → causal_continuity_engine-0.2.0/vectors/obligation_missing.json +21 -21
- causal_continuity_engine-0.2.0/vectors/obligation_wrong_kind.json +177 -0
- causal_continuity_engine-0.2.0/vectors/obligation_wrong_task.json +177 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/policy_decision_wrong_type.json +23 -18
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/retry_cannot_launder_a_failure.json +29 -24
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/self_asserted_cannot_satisfy.json +25 -20
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/self_assertion_cannot_poison_authoritative_pass.json +29 -24
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/status_contradicts_contents.json +25 -20
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/summary_contradicts_contents.json +25 -20
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/tamper_statement.json +25 -20
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/tamper_statement_resealed.json +25 -20
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/task_id_under_unrelated_field.json +20 -20
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/unbound_task.json +17 -17
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/unknown_action_intent_field.json +25 -20
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/unknown_algorithm.json +25 -20
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/unknown_evidence_context_field.json +25 -20
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/unknown_execution_field.json +25 -20
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/unknown_schema_version.json +25 -20
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/unknown_top_level_field.json +25 -20
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/unknown_verification_field.json +25 -20
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/unverified_forged_body_no_key.json +25 -20
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/unverified_hmac_no_key.json +25 -20
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/valid_hmac.json +26 -21
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/valid_hmac_jcs_edges.json +26 -21
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/valid_hmac_unicode.json +26 -21
- causal_continuity_engine-0.2.0/vectors/valid_lamport.json +1463 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/vectors/wrong_project.json +25 -20
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/verifiers/verify_proof.py +16 -3
- causal_continuity_engine-0.1.6/causal_continuity_engine/__init__.py +0 -21
- causal_continuity_engine-0.1.6/tests/test_regressions_round18_co_assertion.py +0 -119
- causal_continuity_engine-0.1.6/vectors/input_item_wrong_type.json +0 -163
- causal_continuity_engine-0.1.6/vectors/lamport_fingerprint_spoof.json +0 -1458
- causal_continuity_engine-0.1.6/vectors/lamport_no_registry.json +0 -1454
- causal_continuity_engine-0.1.6/vectors/lamport_truncated_key.json +0 -1454
- causal_continuity_engine-0.1.6/vectors/valid_lamport.json +0 -1458
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.editorconfig +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.gitattributes +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.githooks/commit-msg +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.githooks/pre-commit +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/CODEOWNERS +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/ISSUE_TEMPLATE/feature.yml +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/SECURITY.md +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/SUPPORT.md +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/dependabot.yml +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/pull_request_template.md +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/release.yml +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/ruleset.README.md +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/ruleset.json +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/scripts/bootstrap_tools.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/scripts/build_distributions.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/scripts/check_attribution.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/scripts/check_clean.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/scripts/check_content_marks.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/scripts/check_release_metadata.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/scripts/check_release_tag.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/scripts/check_stdlib.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/scripts/prepare_release_tag.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/scripts/render_api_docs.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/scripts/run_gates.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/scripts/run_isolated_review.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/tag-ruleset.json +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/workflows/ci.yml +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/workflows/commit-signature-audit.yml +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/workflows/content-integrity-pr.yml +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/workflows/content-integrity.yml +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/workflows/dependency-review.yml +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/workflows/no-ai-attribution.yml +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/workflows/release.yml +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.github/workflows/secret-scan.yml +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.gitignore +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.gitleaks.toml +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/.pre-commit-config.yaml +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/LICENSE.txt +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/MANIFEST.in +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/NOTICE +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/benchmarks/__init__.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/benchmarks/continuitybench/__init__.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/causal_continuity_engine/capabilities.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/causal_continuity_engine/core.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/causal_continuity_engine/evidence.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/causal_continuity_engine/github.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/causal_continuity_engine/lamport.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/causal_continuity_engine/learning.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/causal_continuity_engine/ontology.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/causal_continuity_engine/py.typed +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/causal_continuity_engine/redaction.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/causal_continuity_engine/verifiers.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/causal_continuity_engine.egg-info/dependency_links.txt +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/causal_continuity_engine.egg-info/entry_points.txt +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/causal_continuity_engine.egg-info/requires.txt +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/causal_continuity_engine.egg-info/top_level.txt +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/docs/CAPABILITIES.md +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/docs/CONTENT-INGRESS-FIREWALL.md +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/docs/PUBLIC-FLIP.md +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/docs/REQUIREMENTS.md +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/docs/RESEARCH-ROADMAP.md +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/docs/TESTING.md +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/docs/V0.1.5-TRUST-CLOSURE.md +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/docs/assets/demo.svg +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/docs/assets/social-preview.png +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/examples/backfill_github.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/examples/quickstart.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/justfile +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/schemas/cce.anchor.v1.json +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/schemas/cce.capsule.v1.json +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/schemas/cce.continuity-receipt.v1.json +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/schemas/cce.event.v1.json +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/schemas/cce.proof-predicate.v1.json +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/schemas/cce.proof.v1.json +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/schemas/cce.recovery.v1.json +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/schemas/cce.resume.v1.json +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/setup.cfg +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/__init__.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/schema_validation.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_attribution_controls.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_benchmark_runner.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_content_marks.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_distribution_environment.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_github_redaction.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_isolated_review.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_regressions_round12_release_blockers.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_regressions_round13_jcs.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_regressions_round15_capsule_invalidation_github.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_regressions_round15_public_boundaries.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_regressions_round15_storage_boundaries.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_regressions_round16_cli_api_core_capabilities.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_regressions_round18_journal.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_regressions_round8_boundaries.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_regressions_round8_state.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_regressions_round9_scope_freshness.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_sqlite_lifecycle.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/tests/test_store_graph.py +0 -0
- {causal_continuity_engine-0.1.6 → causal_continuity_engine-0.2.0}/verifiers/__init__.py +0 -0
|
@@ -54,10 +54,10 @@ do. `just setup` installs every direct and transitive tool from
|
|
|
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
56
|
`pytest` 9.1.1, `ruff` 0.16.7, `build` 1.6.1, `jsonschema` 4.26.0,
|
|
57
|
-
`setuptools`
|
|
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
|
|
|
60
|
-
The
|
|
60
|
+
The security review on 2026-09-15 recorded setuptools 83.0.0 as the first
|
|
61
61
|
patched release for
|
|
62
62
|
[GHSA-h35f-9h28-mq5c](https://github.com/advisories/GHSA-h35f-9h28-mq5c)
|
|
63
63
|
and pip 26.2.1 is later than the first patched release for
|
|
@@ -68,9 +68,10 @@ and the lock carries Pygments 2.20.0, the fix for
|
|
|
68
68
|
[GHSA-5239-wwwm-4pmq](https://github.com/advisories/GHSA-5239-wwwm-4pmq).
|
|
69
69
|
On that date pytest 9.1.1, ruff 0.16.7, build 1.6.1, jsonschema 4.26.0 and pip
|
|
70
70
|
26.2.1 were the current stable releases on PyPI; build 1.5.1 remains yanked.
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
71
|
+
That review retained setuptools 83.0.0 without evaluating 84.0.0. The current
|
|
72
|
+
84.0.0 pin is a subsequent build-tool update, with matching direct inputs and
|
|
73
|
+
hash lock. The security review is a dated record, not a claim that pins stay
|
|
74
|
+
current without future review.
|
|
74
75
|
|
|
75
76
|
When a direct pin changes, edit `pyproject.toml` and `requirements-dev.in`,
|
|
76
77
|
regenerate the lock with the command recorded in its header, and review the
|
|
@@ -96,7 +96,8 @@ SDIST_GENERATED_FILES = {
|
|
|
96
96
|
f"{EGG_INFO}/top_level.txt",
|
|
97
97
|
}
|
|
98
98
|
# Selected shipped test modules, chosen to cover the installed
|
|
99
|
-
# CLI,
|
|
99
|
+
# CLI, store and graph, trust, conformance, authority/scoped-packet contracts
|
|
100
|
+
# and bounded CLI/HTTP/MCP transports
|
|
100
101
|
# against the artifact itself. The rest ship as audit evidence a reader can
|
|
101
102
|
# run, not as checks this gate executes.
|
|
102
103
|
WHEEL_BEHAVIOR_TESTS = (
|
|
@@ -107,6 +108,8 @@ WHEEL_BEHAVIOR_TESTS = (
|
|
|
107
108
|
"tests/test_cli.py",
|
|
108
109
|
"tests/test_conformance.py",
|
|
109
110
|
"tests/test_mcp_server.py",
|
|
111
|
+
"tests/test_installed_contracts.py",
|
|
112
|
+
"tests/test_installed_packet_bounds.py",
|
|
110
113
|
)
|
|
111
114
|
WHEEL_EVIDENCE_TREES = {
|
|
112
115
|
"benchmarks": {".py"},
|
|
@@ -19,6 +19,21 @@ RAW_ORIGIN = (
|
|
|
19
19
|
TAG_RE = re.compile(r"v[0-9]+\.[0-9]+\.[0-9]+\Z")
|
|
20
20
|
SCHEMA_VERSION_RE = re.compile(r"cce\.[a-z][a-z0-9-]*\.v[1-9][0-9]*\Z")
|
|
21
21
|
MAX_SCHEMA_BYTES = 2 * 1024 * 1024
|
|
22
|
+
SCHEMA_RELEASES = {
|
|
23
|
+
"cce.anchor.v1.json": "v0.1.0",
|
|
24
|
+
"cce.capsule.v1.json": "v0.1.0",
|
|
25
|
+
"cce.continuity-receipt.v1.json": "v0.1.0",
|
|
26
|
+
"cce.event.v1.json": "v0.1.0",
|
|
27
|
+
"cce.proof-predicate.v1.json": "v0.1.0",
|
|
28
|
+
"cce.proof.v1.json": "v0.1.0",
|
|
29
|
+
"cce.recovery.v1.json": "v0.1.0",
|
|
30
|
+
"cce.resume.v1.json": "v0.1.0",
|
|
31
|
+
"cce.capsule.v2.json": "v0.2.0",
|
|
32
|
+
"cce.continuity-receipt.v2.json": "v0.2.0",
|
|
33
|
+
"cce.proof-predicate.v2.json": "v0.2.0",
|
|
34
|
+
"cce.proof.v2.json": "v0.2.0",
|
|
35
|
+
"cce.resume.v2.json": "v0.2.0",
|
|
36
|
+
}
|
|
22
37
|
|
|
23
38
|
|
|
24
39
|
def _runtime_schema_versions(root: Path) -> dict[str, str]:
|
|
@@ -61,8 +76,11 @@ def _runtime_schema_versions(root: Path) -> dict[str, str]:
|
|
|
61
76
|
def _schema_public_urls(root: Path) -> dict[str, str]:
|
|
62
77
|
names = sorted(
|
|
63
78
|
f"{version}.json" for version in _runtime_schema_versions(root).values())
|
|
79
|
+
unreviewed = sorted(set(names) - SCHEMA_RELEASES.keys())
|
|
80
|
+
if unreviewed:
|
|
81
|
+
raise SystemExit("unreviewed schema release identity: " + ", ".join(unreviewed))
|
|
64
82
|
return {
|
|
65
|
-
name: f"{RAW_ORIGIN}/
|
|
83
|
+
name: f"{RAW_ORIGIN}/{SCHEMA_RELEASES[name]}/schemas/{name}"
|
|
66
84
|
for name in names
|
|
67
85
|
}
|
|
68
86
|
|
|
@@ -147,8 +165,8 @@ def verify(
|
|
|
147
165
|
"public schema inventory differs from the reviewed runtime contract")
|
|
148
166
|
|
|
149
167
|
# A schema TypeURI identifies that schema version, not the package release
|
|
150
|
-
# currently carrying it.
|
|
151
|
-
#
|
|
168
|
+
# currently carrying it. Each reviewed filename retains its assigned release
|
|
169
|
+
# independently of both the package tag and the payload's claimed $id.
|
|
152
170
|
expected_urls = set(schema_public_urls.values())
|
|
153
171
|
observed_ids: set[str] = set()
|
|
154
172
|
for name in schema_names:
|
|
@@ -171,7 +189,7 @@ def verify(
|
|
|
171
189
|
+ ", ".join(sorted(unexpected_urls)))
|
|
172
190
|
|
|
173
191
|
# Fetch the committed identity itself. The explicit map above freezes
|
|
174
|
-
#
|
|
192
|
+
# each reviewed identity; this variable makes the deciding path follow the
|
|
175
193
|
# schema's checked-in $id rather than the current package tag.
|
|
176
194
|
remote_bytes = fetch(committed_url)
|
|
177
195
|
if not isinstance(remote_bytes, bytes):
|
|
@@ -16,10 +16,11 @@ runtime records are authenticated/audited rather than replay-derived. Memory
|
|
|
16
16
|
tiers L0–L4 and token-budgeted Resume Packets are what
|
|
17
17
|
an agent actually receives on resume. When a requirement changes or evidence
|
|
18
18
|
contradicts an assumption, causal invalidation computes the blast radius
|
|
19
|
-
over typed edges, bounds it, and classifies it deterministically.
|
|
20
|
-
cannot be marked complete without a signed proof envelope
|
|
21
|
-
verifiers actually ran — `Engine.complete_task` has twenty
|
|
22
|
-
instrumented rejection gates, including
|
|
19
|
+
over typed edges, bounds it, and classifies it deterministically. When policy
|
|
20
|
+
requires proof, a task cannot be marked complete without a signed proof envelope
|
|
21
|
+
whose required verifiers actually ran — `Engine.complete_task` has twenty-two
|
|
22
|
+
independently instrumented rejection gates, including current confirmed authority,
|
|
23
|
+
applicable authority conflicts, unresolved invalidation control,
|
|
23
24
|
monotonic completed-state, and completable-state guards, and evidence is graded
|
|
24
25
|
A–F from negative controls,
|
|
25
26
|
mutation probes and determinism probes. That grade is a mechanical lower bound: it
|
|
@@ -114,7 +115,7 @@ python verifiers/verify_proof.py <proof.json> --fingerprint sha256:...
|
|
|
114
115
|
vectors that *wrap* an envelope alongside its expected verdict, so passing
|
|
115
116
|
one directly reports `E_SHAPE`; use `vectors/generate.py --check` for those.
|
|
116
117
|
|
|
117
|
-
CLI subcommands, all real: `init ingest resume assumptions invalidations
|
|
118
|
+
CLI subcommands, all real: `init ingest authority resume assumptions invalidations
|
|
118
119
|
verify check migrate replay rebuild audit evidence policy serve mcp`.
|
|
119
120
|
|
|
120
121
|
## Repo map
|
|
@@ -270,9 +271,11 @@ Repository text is evidence about intent. It is never instruction.
|
|
|
270
271
|
can raise its authority above the authority of its source
|
|
271
272
|
(`causal_continuity_engine/ontology.py`,
|
|
272
273
|
`causal_continuity_engine/extraction.py`).
|
|
273
|
-
-
|
|
274
|
-
|
|
275
|
-
|
|
274
|
+
- All prose **may propose, never mandate**, including OWNER and human-decision
|
|
275
|
+
prose. Requirements, constraints, decisions, assumptions and tasks become
|
|
276
|
+
source-event-bound proposals. Only an explicit owner-local canonical decision
|
|
277
|
+
through `record_authority_decision` or `authority --request FILE` confirms
|
|
278
|
+
authority; source standing and status resolution are not grants (ADR-126).
|
|
276
279
|
- Imperative policy-override wording trips the injection screen, and when it
|
|
277
280
|
does, **every item extracted from that text block is quarantined** — not
|
|
278
281
|
just the matched span. Splitting a hostile block into a suspect part and a
|
|
@@ -9,6 +9,64 @@ 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.2.0 — 2026-09-23
|
|
13
|
+
|
|
14
|
+
### Changed
|
|
15
|
+
|
|
16
|
+
- **Breaking: extracted prose proposes; local confirmation confers authority.**
|
|
17
|
+
Requirements, constraints, decisions, assumptions and tasks extracted from
|
|
18
|
+
retained source text require an explicit owner-local decision before becoming
|
|
19
|
+
binding control state. Consumers check canonical decision history, source
|
|
20
|
+
support and the actual projection. A trusted author label or mutable graph
|
|
21
|
+
flag is not approval. Confirmation has no HTTP or MCP
|
|
22
|
+
endpoint; this trusts the existing OS/store owner, not an independently
|
|
23
|
+
authenticated human or a process isolated from that same account (ADR-126).
|
|
24
|
+
- **Breaking: processor compatibility advances to `cce-processor/1.9.0` and
|
|
25
|
+
extraction to `cce-deterministic/1.4.0`.** Preserve older projected stores and
|
|
26
|
+
their SQLite sidecars after stopping writers. Re-ingest retained sources into
|
|
27
|
+
a separate new store/project and review its proposals before confirming them.
|
|
28
|
+
Older authority projections do not upgrade in place; erased source payloads
|
|
29
|
+
cannot be reconstructed by replay. Existing finite admission limits still
|
|
30
|
+
apply; the version check is not a claim of complete database provenance.
|
|
31
|
+
- **Proof v2 binds the complete applicable obligation set.** Confirmed task
|
|
32
|
+
proofs include applicable requirements, constraints, decisions and assumptions,
|
|
33
|
+
their canonical scope and the relevant policy. Caller-supplied links cannot
|
|
34
|
+
subtract mandatory controls. Initial and final deciding reads are separate;
|
|
35
|
+
later changes can stale the proof. A verifier's evidence grade remains a
|
|
36
|
+
mechanical binding check, not proof of the obligation's semantic truth
|
|
37
|
+
(ADR-127).
|
|
38
|
+
- **Resume v2 is complete and explicitly project- or task-scoped.** Mandatory
|
|
39
|
+
controls, work, policy and trust information cannot be silently trimmed to fit
|
|
40
|
+
a budget. Watermarks are scope-specific; descriptive target metadata is not
|
|
41
|
+
a task selector. Current capsule v2 and continuity-receipt v2 remain project-only.
|
|
42
|
+
Historical v1 schemas are retained for interpretation, not current proof or
|
|
43
|
+
receipt acceptance (ADR-128).
|
|
44
|
+
- **Successful resume responses have a hard serialized-byte bound.** The default
|
|
45
|
+
is 131,072 bytes; the accepted range is 1 through 1,048,576. Engine, CLI, HTTP
|
|
46
|
+
and MCP count their actual final representation, including the relevant wrapper
|
|
47
|
+
and line ending. Only optional sections may be removed. Mandatory overflow
|
|
48
|
+
refuses before signing, collision audit or watermark advancement. Packet-budget
|
|
49
|
+
refusals have a separate 1,024-byte bound. This does not bound computation,
|
|
50
|
+
input memory, HTTP headers, arbitrary reserialization or an outer capsule
|
|
51
|
+
(ADR-129).
|
|
52
|
+
|
|
53
|
+
### Fixed
|
|
54
|
+
|
|
55
|
+
- **Task expiry during packet composition used two validity instants.** Final
|
|
56
|
+
watermark admission now retains the selected instant while rechecking canonical
|
|
57
|
+
authority, source support, projected semantics and live status. Later freshness
|
|
58
|
+
uses current time; an as-of packet is not a lease. Unrelated late failures do
|
|
59
|
+
not promise to refund a consumed signature (ADR-130).
|
|
60
|
+
- **One obligation read repeatedly reconstructed the same canonical witnesses.**
|
|
61
|
+
Validated control witnesses and shared scope-task identities are reused only
|
|
62
|
+
within that non-mutating call, never across requests or a writer's own changes.
|
|
63
|
+
Measured read counts fall without dropping authority checks. Distinct witnesses
|
|
64
|
+
still traverse history; no latency or total-history scaling bound is claimed
|
|
65
|
+
(ADR-131).
|
|
66
|
+
- **The continuity-receipt specification named the historical v1 contract.**
|
|
67
|
+
SPEC §12 now matches the current project-only v2 producer and verifier, including
|
|
68
|
+
expected-scope binding and archived-v1 refusal. Historical schemas are unchanged.
|
|
69
|
+
|
|
12
70
|
## 0.1.6 — 2026-09-20
|
|
13
71
|
|
|
14
72
|
Carries the unpublished 0.1.5 line forward with processor compatibility,
|
|
@@ -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-09-
|
|
11
|
+
version: 0.2.0
|
|
12
|
+
date-released: 2026-09-23
|
|
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.2.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
|
|
@@ -73,8 +73,8 @@ 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
74
|
*why* is a queryable edge and not a memory. When a requirement changes or evidence contradicts an assumption, the
|
|
75
75
|
blast radius is computed over typed edges, bounded, and classified
|
|
76
|
-
deterministically.
|
|
77
|
-
envelope whose required verifiers actually ran — the rejection gates are
|
|
76
|
+
deterministically. When policy requires proof, a task cannot be marked complete
|
|
77
|
+
without a signed envelope whose required verifiers actually ran — the rejection gates are
|
|
78
78
|
mechanically enumerated and mutation-tested below.
|
|
79
79
|
|
|
80
80
|
Event integrity separates two facts that are easy to conflate:
|
|
@@ -102,18 +102,32 @@ can read a project's control state directly. Four read-only tools:
|
|
|
102
102
|
|
|
103
103
|
The subcommand first ships in 0.1.6. The published 0.1.0, 0.1.2 and 0.1.3
|
|
104
104
|
packages do not include it; 0.1.4 was prepared but never published, and 0.1.5
|
|
105
|
-
was tagged but never published. The
|
|
105
|
+
was tagged but never published. The released 0.1.6 lifecycle has been exercised with
|
|
106
106
|
the reference MCP SDK; other clients are expected to work over the same
|
|
107
107
|
transport but have not been exercised here.
|
|
108
108
|
|
|
109
|
+
Initialize a fresh project with the quickstart below before connecting a client.
|
|
110
|
+
Use the absolute path to the installed `cce-engine` executable and the initialized
|
|
111
|
+
project directory in the client configuration; an editor may not inherit your
|
|
112
|
+
terminal's virtual environment or working directory. For example, on macOS/Linux:
|
|
113
|
+
|
|
109
114
|
```json
|
|
110
115
|
{
|
|
111
116
|
"mcpServers": {
|
|
112
|
-
"cce": {
|
|
117
|
+
"cce": {
|
|
118
|
+
"command": "/absolute/path/to/.venv/bin/cce-engine",
|
|
119
|
+
"args": ["--dir", "/absolute/path/to/cce-demo", "mcp"]
|
|
120
|
+
}
|
|
113
121
|
}
|
|
114
122
|
}
|
|
115
123
|
```
|
|
116
124
|
|
|
125
|
+
On Windows, use the virtual environment's `Scripts/cce-engine.exe`; forward
|
|
126
|
+
slashes avoid JSON backslash escaping. Replace both example paths with real paths.
|
|
127
|
+
MCP observes a closed store: stop writers cleanly before connecting. Any SQLite
|
|
128
|
+
WAL, SHM, or rollback-journal sidecar causes refusal rather than a partial view.
|
|
129
|
+
Never delete a sidecar to force admission; it may contain recovery data.
|
|
130
|
+
|
|
117
131
|
The server is read-only by design. An MCP client is an untrusted caller in this
|
|
118
132
|
project's authority model, so nothing exposed here mutates state, mints a proof,
|
|
119
133
|
or grants autonomy — a test fails if a future tool name suggests otherwise. It
|
|
@@ -122,25 +136,61 @@ than the official SDK, which would pull in more than twenty packages.
|
|
|
122
136
|
|
|
123
137
|
## Quickstart
|
|
124
138
|
|
|
125
|
-
|
|
139
|
+
The installation commands below install the package PyPI currently serves; to
|
|
140
|
+
run this exact checkout, including its authority and v2 packet examples, use
|
|
141
|
+
the editable installation that follows.
|
|
142
|
+
|
|
143
|
+
Python 3.11 or newer is required; the engine has no third-party runtime
|
|
144
|
+
dependencies. Choose the block for your platform and run it in a new working
|
|
145
|
+
directory.
|
|
146
|
+
|
|
147
|
+
macOS/Linux:
|
|
126
148
|
|
|
127
149
|
```bash
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
150
|
+
python3 -m venv .venv
|
|
151
|
+
source .venv/bin/activate
|
|
152
|
+
python -m pip install causal-continuity-engine
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Windows PowerShell:
|
|
156
|
+
|
|
157
|
+
```powershell
|
|
158
|
+
py -3 -m venv .venv
|
|
159
|
+
.\.venv\Scripts\Activate.ps1
|
|
131
160
|
python -m pip install causal-continuity-engine
|
|
132
161
|
```
|
|
133
162
|
|
|
134
|
-
|
|
135
|
-
|
|
163
|
+
If PowerShell blocks activation, do not weaken its execution policy: install
|
|
164
|
+
with `.\.venv\Scripts\python.exe -m pip install causal-continuity-engine`
|
|
165
|
+
and invoke the environment's `cce-engine.exe` by its absolute path in the
|
|
166
|
+
commands below. After activation, `cce-engine --help` checks the installation.
|
|
167
|
+
|
|
168
|
+
**Upgrading an existing project:** this release uses processor 1.9.0 and
|
|
169
|
+
extractor 1.4.0; projections written by 0.1.6's processor 1.8.0 or earlier
|
|
170
|
+
processors are refused. There is no in-place projection or authority upgrade. Stop writers,
|
|
171
|
+
preserve the complete old project state (including its database and any SQLite
|
|
172
|
+
sidecars), and re-ingest retained sources into a separate new project/store.
|
|
173
|
+
Review and explicitly confirm the new proposals there; old prose is not approval.
|
|
174
|
+
Do not remove markers or sidecars to bypass refusal. Payloads already removed
|
|
175
|
+
by retention cannot be reconstructed from their digests. New users can simply
|
|
176
|
+
start a fresh project. See [the upgrade notes for this release](CHANGELOG.md#020--2026-09-23);
|
|
177
|
+
the [0.1.6 notes](CHANGELOG.md#016--2026-09-20) remain historical.
|
|
178
|
+
|
|
179
|
+
To run this exact checkout instead of the published package, or to work on the
|
|
180
|
+
engine, replace the path below with the checkout's path and install it
|
|
181
|
+
editable — see [.github/CONTRIBUTING.md](.github/CONTRIBUTING.md) for the
|
|
182
|
+
development toolchain:
|
|
136
183
|
|
|
137
184
|
```bash
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
185
|
+
cd /absolute/path/to/this/local/checkout
|
|
186
|
+
python3 -m venv .venv
|
|
187
|
+
source .venv/bin/activate
|
|
141
188
|
python -m pip install -e .
|
|
142
189
|
```
|
|
143
190
|
|
|
191
|
+
On Windows, use the PowerShell environment-creation and activation commands
|
|
192
|
+
above, then `python -m pip install -e .` from the checkout.
|
|
193
|
+
|
|
144
194
|
Global flags come **before** the subcommand: `cce-engine --dir <path> <subcommand>`.
|
|
145
195
|
|
|
146
196
|
```bash
|
|
@@ -209,103 +259,138 @@ cce-engine --dir . ingest --event push --delivery-id d2 --file push.json
|
|
|
209
259
|
# ingested push: 0 node(s), 0 invalidation(s), 0 conflict(s)
|
|
210
260
|
```
|
|
211
261
|
|
|
212
|
-
The extractor
|
|
213
|
-
|
|
262
|
+
The extractor proposed three claims: a requirement, a constraint and an
|
|
263
|
+
assumption. Even an `OWNER` source does not approve them. At this point:
|
|
214
264
|
|
|
215
265
|
```bash
|
|
216
266
|
cce-engine --dir . assumptions --status active
|
|
217
|
-
#
|
|
267
|
+
# no assumptions
|
|
218
268
|
```
|
|
219
269
|
|
|
220
|
-
|
|
221
|
-
|
|
270
|
+
Only for this **fresh, initialized demo directory that you control**, save the
|
|
271
|
+
following as `prepare_reviews.py`. It prepares review operands for the three
|
|
272
|
+
exact statements above; it does not approve them or read signing keys. This is
|
|
273
|
+
an owner-local Python example, not a general secure filesystem opener or a
|
|
274
|
+
read-only guarantee: `Engine` normally opens writable, schema-capable storage.
|
|
275
|
+
|
|
276
|
+
<!-- quickstart-review-requests -->
|
|
277
|
+
|
|
278
|
+
```python
|
|
279
|
+
import json
|
|
280
|
+
from pathlib import Path
|
|
281
|
+
|
|
282
|
+
from causal_continuity_engine.engine import Engine
|
|
283
|
+
|
|
284
|
+
root = Path.cwd()
|
|
285
|
+
meta = json.loads((root / ".cce" / "meta.json").read_text(encoding="utf-8"))
|
|
286
|
+
engine = Engine(root / ".cce" / "cce.db", tenant_id=meta["tenant_id"], workdir=root)
|
|
287
|
+
try:
|
|
288
|
+
def prepare(kind, text):
|
|
289
|
+
matches = [node for node in engine.graph.current(
|
|
290
|
+
meta["project_id"], "claim", tenant_id=meta["tenant_id"])
|
|
291
|
+
if node["data"].get("proposed_kind") == kind
|
|
292
|
+
and node["data"].get("statement") == text]
|
|
293
|
+
if len(matches) != 1:
|
|
294
|
+
raise ValueError("expected exactly one matching retained proposal")
|
|
295
|
+
proposal = engine.authority_proposal(meta["project_id"], matches[0]["node_id"])
|
|
296
|
+
request = {
|
|
297
|
+
"operation": "confirm", "request_id": "quickstart-" + kind,
|
|
298
|
+
"tenant_id": meta["tenant_id"], "project_id": meta["project_id"],
|
|
299
|
+
**proposal, "authority_scope": {"kind": "global"},
|
|
300
|
+
}
|
|
301
|
+
(root / ("review-" + kind + ".json")).write_text(
|
|
302
|
+
json.dumps(request, indent=2) + "\n", encoding="utf-8")
|
|
303
|
+
|
|
304
|
+
prepare("requirement", "Exporter must stream rows instead of buffering")
|
|
305
|
+
prepare("constraint", "The exporter must not hold the whole result set in memory")
|
|
306
|
+
prepare("assumption", "the upstream feed is ordered by timestamp")
|
|
307
|
+
finally:
|
|
308
|
+
engine.close()
|
|
309
|
+
```
|
|
222
310
|
|
|
223
311
|
```bash
|
|
224
|
-
|
|
312
|
+
python prepare_reviews.py
|
|
225
313
|
```
|
|
226
314
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
## Mission
|
|
232
|
-
**Project:** octo/demo
|
|
233
|
-
**Objective:** No explicit mission pinned; see open work.
|
|
234
|
-
**Target:** {}
|
|
235
|
-
|
|
236
|
-
## Mission control state
|
|
237
|
-
### Pinned
|
|
238
|
-
- none pinned
|
|
239
|
-
### Retired
|
|
240
|
-
- none retired
|
|
241
|
-
|
|
242
|
-
## Authority
|
|
243
|
-
- instruction precedence: tenant_policy > human_decision > repository_authoritative > agent_inference > untrusted_content
|
|
244
|
-
### Active constraints
|
|
245
|
-
- The exporter must not hold the whole result set in memory (high)
|
|
246
|
-
### Active requirements
|
|
247
|
-
- Exporter must stream rows instead of buffering
|
|
315
|
+
Inspect the complete source in `issue.json`, the exact retained proposal text,
|
|
316
|
+
and **each complete request file**, including its tenant/project and global
|
|
317
|
+
scope. Stop if they do not match what you intend to authorize. Preparing these
|
|
318
|
+
files is not approval. Submit each only if you approve that individual statement:
|
|
248
319
|
|
|
249
|
-
|
|
250
|
-
|
|
320
|
+
```bash
|
|
321
|
+
# Only after approving the requirement:
|
|
322
|
+
cce-engine --dir . --json authority --request review-requirement.json
|
|
323
|
+
# Only after approving the constraint:
|
|
324
|
+
cce-engine --dir . --json authority --request review-constraint.json
|
|
325
|
+
# Only after approving the assumption:
|
|
326
|
+
cce-engine --dir . --json authority --request review-assumption.json
|
|
327
|
+
```
|
|
251
328
|
|
|
252
|
-
|
|
253
|
-
-
|
|
329
|
+
Each command returns a receipt naming the confirmation and canonical event.
|
|
330
|
+
Now `cce-engine --dir . assumptions --status active` lists the confirmed
|
|
331
|
+
assumption. Owner-local authority means possession of the local OS/store
|
|
332
|
+
capability, not independent authentication of a human. Neither HTTP nor MCP
|
|
333
|
+
exposes this confirmation operation. Revocation and scope replacement also use
|
|
334
|
+
explicit structured decisions; editing a source does not silently approve new text.
|
|
254
335
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
336
|
+
A Resume Packet is what an agent picking up the work receives instead of a
|
|
337
|
+
summary. A project packet includes all applicable mandatory control, work,
|
|
338
|
+
policy and trust state. `resume --task-id <confirmed-task-id>` explicitly selects
|
|
339
|
+
a live confirmed task and its applicable controls; descriptive `--issue` or
|
|
340
|
+
target metadata does not select authority. Task and project freshness records
|
|
341
|
+
are separate, while broad project safety changes can stale both. Capsules and
|
|
342
|
+
continuity receipts remain project-only, not task-specific verdicts.
|
|
343
|
+
|
|
344
|
+
The token budget is an advisory trimming target, not a hard ceiling; mandatory
|
|
345
|
+
state is not dropped to meet it. `token_estimate` is not a model-specific
|
|
346
|
+
tokenizer count. Separately, `--max-response-bytes` is a hard bound on the final
|
|
347
|
+
UTF-8 response (default `131072`, allowed `1`–`1048576`). For CLI output that
|
|
348
|
+
includes JSON formatting or terminal sanitization and the final newline. HTTP
|
|
349
|
+
measures its JSON body; MCP measures the complete result frame including its
|
|
350
|
+
request ID and newline. Re-encoding elsewhere is not covered by this bound.
|
|
351
|
+
|
|
352
|
+
Only optional context may be trimmed, with omissions disclosed. If complete
|
|
353
|
+
mandatory state cannot fit, CCE refuses before packet signing or a new success
|
|
354
|
+
watermark. The CLI returns exit 2 with the fixed `packet_budget_exceeded` error
|
|
355
|
+
on stderr, not a partial packet; the small error frame has its own bound.
|
|
356
|
+
Use an adequate limit or legitimate narrower task scope, never truncate authority.
|
|
260
357
|
|
|
261
|
-
|
|
262
|
-
-
|
|
358
|
+
```bash
|
|
359
|
+
cce-engine --dir . resume --token-budget 1500
|
|
360
|
+
```
|
|
263
361
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
- none
|
|
362
|
+
Selected lines from that real Markdown output follow. `...` marks excerpted
|
|
363
|
+
content here, not a packet omission; the actual output includes the complete
|
|
364
|
+
mandatory members, configured policy and other sections.
|
|
268
365
|
|
|
269
|
-
|
|
366
|
+
<!-- quickstart-packet-excerpt -->
|
|
270
367
|
|
|
271
|
-
|
|
272
|
-
|
|
368
|
+
```markdown
|
|
369
|
+
Scope: {"kind": "project"} | complete: True
|
|
370
|
+
Response: cli-markdown | max bytes: 131072
|
|
273
371
|
|
|
372
|
+
## Mandatory control
|
|
373
|
+
...
|
|
374
|
+
## Authority
|
|
375
|
+
...
|
|
376
|
+
### Active requirements
|
|
377
|
+
- Exporter must stream rows instead of buffering
|
|
378
|
+
...
|
|
274
379
|
## Trust
|
|
275
380
|
- autonomy level: 0
|
|
276
381
|
- required verifiers: none
|
|
277
382
|
- verification gaps: policy:proof-required-without-required-verifiers
|
|
278
|
-
|
|
279
|
-
- none
|
|
280
|
-
### Failed or stale checks
|
|
281
|
-
- none
|
|
282
|
-
|
|
283
|
-
## Evidence index
|
|
284
|
-
- asm_...: evt_...
|
|
285
|
-
|
|
286
|
-
## Recent context
|
|
287
|
-
- none
|
|
288
|
-
|
|
289
|
-
## Continuity lineage
|
|
290
|
-
- source session: none
|
|
291
|
-
- checkpoints: []
|
|
292
|
-
- packet generation time: ...
|
|
293
|
-
|
|
294
|
-
## Omissions
|
|
295
|
-
- none
|
|
296
|
-
|
|
383
|
+
...
|
|
297
384
|
## Transport and cryptographic metadata
|
|
298
|
-
|
|
299
|
-
- schema: cce.resume.
|
|
385
|
+
...
|
|
386
|
+
- schema: cce.resume.v2
|
|
300
387
|
- packet digest present: True
|
|
301
388
|
- signature present: True
|
|
302
|
-
|
|
303
|
-
Evidence coverage: 100% | ~... tokens
|
|
304
389
|
```
|
|
305
390
|
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
391
|
+
The full human view renders each schema field or declares it as metadata kept
|
|
392
|
+
in canonical JSON. Use `resume --format json` for those complete canonical
|
|
393
|
+
field values, including signatures, digests and the state-basis object.
|
|
309
394
|
|
|
310
395
|
The named verification gap is expected on a fresh project: proof is required
|
|
311
396
|
by default, but CCE cannot safely invent a project-specific verifier
|
|
@@ -436,9 +521,10 @@ contract is generated from the live route registry in [docs/API.md](docs/API.md)
|
|
|
436
521
|
|
|
437
522
|
## How it decides a task is done
|
|
438
523
|
|
|
439
|
-
`complete_task` is the false-completion gate
|
|
440
|
-
|
|
441
|
-
|
|
524
|
+
`complete_task` is the false-completion gate, with twenty-two independently
|
|
525
|
+
instrumented rejection paths. Authority and state guards apply even when proof
|
|
526
|
+
is optional. For a new completion, any supplied proof is validated; missing
|
|
527
|
+
proof is rejected when policy requires it:
|
|
442
528
|
|
|
443
529
|
1. **The target is a task in this project.** Another entity type, tenant, or
|
|
444
530
|
project cannot be completed through a borrowed identifier.
|
|
@@ -475,7 +561,10 @@ instrumented rejection paths:
|
|
|
475
561
|
15. **The proof is current.** If a named deliverable or any linked task,
|
|
476
562
|
requirement, decision, assumption, artifact, evidence or action changed
|
|
477
563
|
its signed semantic/version digest since attestation, the proof describes
|
|
478
|
-
a world that no longer exists.
|
|
564
|
+
a world that no longer exists. It also binds the complete applicable
|
|
565
|
+
requirement, constraint, decision and assumption set and verifier policy:
|
|
566
|
+
newly applicable controls, withdrawals and scope changes cannot hide behind
|
|
567
|
+
an unchanged caller-selected list of links.
|
|
479
568
|
16. **The policy declares required verifiers.** Demanding proof without saying
|
|
480
569
|
what must be proven lets the claimant set its own pass mark. This is a
|
|
481
570
|
configuration error and refusing it names the fix.
|
|
@@ -492,6 +581,12 @@ instrumented rejection paths:
|
|
|
492
581
|
20. **The task state did not race validation.** Its version is re-read before
|
|
493
582
|
the proof is claimed and completion is written; a concurrent change forces
|
|
494
583
|
a retry against the new state.
|
|
584
|
+
21. **The task has current authority.** Its owner-local confirmation must still
|
|
585
|
+
have the required canonical decision and retained source witnesses; mutable
|
|
586
|
+
graph labels or an old approval receipt cannot substitute for them.
|
|
587
|
+
22. **Applicable authority is not conflicted.** An applicable blocked, uncertain,
|
|
588
|
+
review-required or explicitly conflicted control prevents completion, even
|
|
589
|
+
under proof-optional policy.
|
|
495
590
|
|
|
496
591
|
The instrument-validation suite plants exactly one defect for each path and
|
|
497
592
|
asserts that the intended gate, rather than a neighboring one, rejects it.
|
|
@@ -599,7 +694,7 @@ determinism`; both exit non-zero on failure.
|
|
|
599
694
|
|
|
600
695
|
## Verifying a proof without trusting the engine
|
|
601
696
|
|
|
602
|
-
[SPEC.md](SPEC.md) is normative: it defines the `cce.proof.
|
|
697
|
+
[SPEC.md](SPEC.md) is normative: it defines the `cce.proof.v2` envelope and
|
|
603
698
|
the five checks (digest, signature, authenticity, sufficiency, scope) well
|
|
604
699
|
enough to reimplement from that text alone.
|
|
605
700
|
[verifiers/verify_proof.py](verifiers/verify_proof.py) is such a
|
|
@@ -608,6 +703,9 @@ reimplementation — standard library only, and it imports nothing from
|
|
|
608
703
|
so agreement between the two is evidence rather than the same code run twice.
|
|
609
704
|
[vectors/](vectors/) is a committed conformance corpus, including honest
|
|
610
705
|
negatives and adversarial forgeries, that pins both implementations in CI.
|
|
706
|
+
Published v1 schemas remain historical contracts; v1 proofs are not current
|
|
707
|
+
completion evidence. The v2 schema URLs are bound to the `v0.2.0` release tag,
|
|
708
|
+
and the release workflow verifies that each serves the checked-out bytes.
|
|
611
709
|
|
|
612
710
|
```bash
|
|
613
711
|
# The complete configured verifier set must already be pinned in project policy.
|
|
@@ -680,7 +778,7 @@ outside the envelope — a fingerprint obtained out of band. SPEC §6 requires
|
|
|
680
778
|
such a registry and says nothing about how it travels, because nothing here
|
|
681
779
|
solves that. No amount of verifier code closes it.
|
|
682
780
|
|
|
683
|
-
**
|
|
781
|
+
**Signing-key revocation is not implemented.** A fingerprint in the registry is trusted for every
|
|
684
782
|
envelope it ever signed. Withdrawing a key is not a mechanism this has.
|
|
685
783
|
|
|
686
784
|
**A stranger cannot tell whether an envelope is still fresh.** An envelope is a
|