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