actenon-kernel 1.0.0__tar.gz → 1.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.
- {actenon_kernel-1.0.0/actenon_kernel.egg-info → actenon_kernel-1.2.0}/PKG-INFO +71 -4
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/README.md +69 -3
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/cli.py +4 -2
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/conformance/test_countersignature_conformance.py +1 -1
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/conformance/test_transparency_log_conformance.py +1 -1
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/conformance/test_trust_artifacts_conformance.py +1 -1
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/local_runtime.py +28 -0
- actenon_kernel-1.2.0/actenon/mcp_server.py +559 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/verifier/countersignature.py +1 -1
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/verifier/transparency.py +1 -1
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/verifier/trust_artifacts.py +1 -1
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0/actenon_kernel.egg-info}/PKG-INFO +71 -4
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon_kernel.egg-info/SOURCES.txt +1 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon_kernel.egg-info/entry_points.txt +1 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon_kernel.egg-info/requires.txt +1 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/pyproject.toml +13 -1
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/tests/test_neutrality.py +3 -3
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/LICENSE +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/adapters/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/adapters/_authorization.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/adapters/base.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/adapters/edge.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/adapters/fastapi.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/adapters/langchain.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/adapters/mcp.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/anchors/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/anchors/local_log.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/anchors/models.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/api/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/api/intake.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/api/invoice_payment.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/api/refund.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/boundary/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/conformance/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/conformance/helpers.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/conformance/manifest.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/conformance/test_artifact_shape_conformance.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/conformance/test_canonicalization_strict_conformance.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/conformance/test_execution_state_conformance.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/conformance/test_outcome_attestation_conformance.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/conformance/test_replay_conformance.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/conformance/test_verifier_sdk_conformance.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/conformance/vectors/canonicalization_strict_v1/cases.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/conformance/vectors/canonicalization_strict_v1/profile.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/conformance/vectors/verifier_sdk_v1/README.md +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/conformance/vectors/verifier_sdk_v1/action_intent.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/conformance/vectors/verifier_sdk_v1/cases.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/conformance/vectors/verifier_sdk_v1/pccb.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/conformance/version.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/core/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/core/errors.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/core/json.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/core/kernel.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/core/redaction.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/coverage_matrix.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/credentials/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/credentials/broker.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/demo/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/demo/local_proof.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/demo/portable_local_proof.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/escrow/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/escrow/base.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/escrow/memory.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/escrow/service.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/escrow/sqlite.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/evidence/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/evidence/query.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/evidence/stores.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/execution/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/execution/mode_aware.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/execution/protected_executor.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/execution_graph.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/gate.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/idempotency.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/local_runtime_server.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/models/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/models/contracts.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/models/evidence.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/models/execution.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/models/intent_record.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/models/invoice_payment.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/models/policy_bundle.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/models/runtime.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/models/serialization.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/outcomes.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/policy/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/policy/engine.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/policy/evidence.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/policy/invoice_payment.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/policy/refund.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/preflight/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/preflight/engine.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/preflight/evidence.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/preflight/models.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/preflight/policy_packs.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/proof/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/proof/audit.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/proof/canonical.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/proof/local.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/proof/refusal_messages.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/proof/service.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/proof/signers/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/proof/signers/aws_kms.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/proof/signers/base.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/proof/signers/external_managed.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/proof/signers/hsm.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/proof/signers/key_lifecycle.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/proof/signers/kms.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/proof/signers/local.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/proof/signers/proof_seal.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/proof/signers/well_known.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/proof/signing.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/receipts/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/receipts/attestation.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/receipts/factory.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/receipts/invoice_payment.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/receipts/refund.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/receipts/store.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/receipts/writers.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/reconciliation/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/reconciliation/base.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/replay/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/replay/base.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/replay/dbapi.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/replay/postgres.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/replay/service.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/replay/sqlite.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/scanner.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/ui/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/ui/trace_viewer/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/ui/trace_viewer/app.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/ui/trace_viewer/static/app.js +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/ui/trace_viewer/static/index.html +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/ui/trace_viewer/static/styles.css +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/ui/trace_viewer/trace_loader.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/verifier/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/verifier/endpoint.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/verifier/middleware.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon/verifier/sdk.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon_kernel.egg-info/dependency_links.txt +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/actenon_kernel.egg-info/top_level.txt +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/CHANGELOG.md +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/MATRIX.md +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/README.md +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/VERSION +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/suite.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vector-lock.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/cloud_invoice_payment_v1/action_intent.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/cloud_invoice_payment_v1/issuer_keys.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/cloud_invoice_payment_v1/mutations/action_hash_changed_pccb.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/cloud_invoice_payment_v1/mutations/amount_changed_action_intent.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/cloud_invoice_payment_v1/mutations/audience_changed_pccb.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/cloud_invoice_payment_v1/mutations/expired_pccb.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/cloud_invoice_payment_v1/mutations/outcome_attestation_hard_revoked_issuer_keys.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/cloud_invoice_payment_v1/mutations/outcome_attestation_wrong_purpose_issuer_keys.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/cloud_invoice_payment_v1/mutations/receipt_attestation_artifact_digest_changed.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/cloud_invoice_payment_v1/mutations/receipt_attestation_issued_at_changed.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/cloud_invoice_payment_v1/mutations/receipt_attestation_issuer_changed.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/cloud_invoice_payment_v1/mutations/receipt_attestation_outcome_artifact_changed.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/cloud_invoice_payment_v1/mutations/receipt_attestation_proof_binding_changed.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/cloud_invoice_payment_v1/mutations/receipt_attestation_signature_changed.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/cloud_invoice_payment_v1/mutations/refusal_attestation_issued_at_changed.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/cloud_invoice_payment_v1/mutations/refusal_attestation_issuer_changed.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/cloud_invoice_payment_v1/mutations/refusal_attestation_signature_changed.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/cloud_invoice_payment_v1/mutations/signature_changed_pccb.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/cloud_invoice_payment_v1/mutations/wrong_kid_pccb.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/cloud_invoice_payment_v1/mutations/wrong_purpose_issuer_keys.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/cloud_invoice_payment_v1/pccb.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/cloud_invoice_payment_v1/receipt.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/cloud_invoice_payment_v1/receipt_attestation.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/cloud_invoice_payment_v1/refusal.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/cloud_invoice_payment_v1/refusal_attestation.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/receipt_countersignature_v1/countersignature.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/receipt_countersignature_v1/mutations/countersignature_altered_digest.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/receipt_countersignature_v1/mutations/countersignature_unknown_kid.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/receipt_countersignature_v1/mutations/trusted_keys_wrong_key.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/receipt_countersignature_v1/receipt.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/receipt_countersignature_v1/trusted_keys.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/transparency_log_v1/checkpoint_new.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/transparency_log_v1/checkpoint_old.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/transparency_log_v1/consistency_proof.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/transparency_log_v1/countersignature.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/transparency_log_v1/inclusion_proof.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/transparency_log_v1/leaf_digest.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/transparency_log_v1/mutations/checkpoint_new_forked.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/transparency_log_v1/mutations/checkpoint_unknown_kid.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/transparency_log_v1/mutations/countersignature_orphan.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/transparency_log_v1/trusted_keys.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/trust_artifacts_v1/README.md +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/trust_artifacts_v1/action_intent.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/trust_artifacts_v1/approval.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/trust_artifacts_v1/approval_trusted_keys.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/trust_artifacts_v1/issuer.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/trust_artifacts_v1/issuer_status_expired.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/trust_artifacts_v1/issuer_status_good.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/trust_artifacts_v1/issuer_status_revoked.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/trust_artifacts_v1/issuer_status_stale.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/trust_artifacts_v1/issuer_status_trusted_keys.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/trust_artifacts_v1/mutations/approval_action_changed.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/trust_artifacts_v1/mutations/approval_signature_changed.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/conformance/vectors/trust_artifacts_v1/mutations/issuer_status_signature_changed.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/adversarial_rsa_policy_stress_test.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/claude_managed_agents_protected_tool/tool.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/credential_broker_infra_delete/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/credential_broker_infra_delete/demo.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/crewai_protected_tool/tool.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/edge_templates/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/edge_templates/_support.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/edge_templates/ci_cd.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/edge_templates/cloud.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/edge_templates/communications.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/edge_templates/database.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/edge_templates/http_api.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/edge_templates/iam.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/edge_templates/ot.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/edge_templates/storage.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/fastapi_protected_route/app.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/fastapi_resource_boundary_refund/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/fastapi_resource_boundary_refund/app.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/fastapi_resource_boundary_refund/test_resource_boundary_refund.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/fastapi_verifier_only_refund/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/fastapi_verifier_only_refund/app.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/fastapi_verifier_only_refund/issuer.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/fastapi_verifier_only_refund/test_verifier_only_refund.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/fastmcp_financial_transfer/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/fastmcp_financial_transfer/mcp_server.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/fastmcp_financial_transfer/test_fastmcp_financial_transfer.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/financial_agent_protected_transfer/financial_agent.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/financial_agent_protected_transfer/test_financial_agent.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/hello_protected_endpoint/server.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/hello_world_protected_resource_python/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/hello_world_protected_resource_python/protected_resource.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/integration_support.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/interactive_execution_demo.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/invoice_payment_guard_local/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/invoice_payment_guard_local/protected_endpoint.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/langchain_protected_tool/tool.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/llamaindex_protected_tool/tool.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/mcp_protected_tool/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/mcp_protected_tool/demo.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/mcp_server_protected_tool/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/mcp_server_protected_tool/demo.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/mcp_server_protected_tool/proof_gate.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/mcp_server_protected_tool/server.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/openai_agents_sdk_protected_tool/app.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/production-reference/client.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/production-reference/verifier_service.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/protected_clinical_ehr_agent/protected_clinical_ehr_agent.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/protected_clinical_ehr_agent/test_protected_clinical_ehr_agent.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/protected_iam_control_plane/protected_iam_control_plane.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/protected_iam_control_plane/test_protected_iam_control_plane.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/protected_langchain_finance_agent/protected_langchain_finance_agent.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/protected_langchain_finance_agent/test_protected_langchain_finance_agent.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/protected_multi_agent_swarm/protected_multi_agent_swarm.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/protected_multi_agent_swarm/test_protected_multi_agent_swarm.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/protected_policy_preflight_refund/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/protected_policy_preflight_refund/policy_preflight_refund.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/protected_policy_preflight_refund/test_policy_preflight_refund.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/quickstart_min.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/refund_guard_local/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/refund_guard_local/call_endpoint.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/refund_guard_local/protected_endpoint.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/refund_guard_local/server.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/examples/semantic_kernel_protected_tool/tool.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/schemas/__init__.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/schemas/action_intent.v1.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/schemas/approval_artifact.v1.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/schemas/issuer_status.v1.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/schemas/pccb.v1.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/schemas/receipt.v1.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/schemas/receipt_attestation.v2alpha1.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/schemas/receipt_countersignature.v1.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/schemas/refusal.v1.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/schemas/refusal_attestation.v2alpha1.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/schemas/transparency_checkpoint.v1.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/schemas/transparency_consistency_proof.v1.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/schemas/transparency_inclusion_proof.v1.json +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/setup.cfg +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/tests/test_adversarial_rsa_policy_stress_test.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/tests/test_cloud_optional.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/tests/test_dx_adoption_fixes.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/tests/test_independence.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/tests/test_interactive_execution_demo.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/tests/test_protocol_drift.py +0 -0
- {actenon_kernel-1.0.0 → actenon_kernel-1.2.0}/tests/test_verification_independence.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: actenon-kernel
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.2.0
|
|
4
4
|
Summary: Open proof-required execution kernel for consequential actions.
|
|
5
5
|
Author: Ross Buckley
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -20,6 +20,7 @@ Description-Content-Type: text/markdown
|
|
|
20
20
|
License-File: LICENSE
|
|
21
21
|
Requires-Dist: actenon-protocol<2,>=1.1.0
|
|
22
22
|
Requires-Dist: pyyaml<7,>=6.0
|
|
23
|
+
Requires-Dist: cryptography>=42
|
|
23
24
|
Provides-Extra: asymmetric
|
|
24
25
|
Requires-Dist: cryptography>=42; extra == "asymmetric"
|
|
25
26
|
Provides-Extra: aws
|
|
@@ -42,6 +43,8 @@ Dynamic: license-file
|
|
|
42
43
|
|
|
43
44
|
# Actenon Kernel
|
|
44
45
|
|
|
46
|
+
<!-- mcp-name: io.github.actenon/kernel -->
|
|
47
|
+
|
|
45
48
|
> The open verifier for proof-bound consequential execution. Defines what a valid proof is. Verifies proofs at the execution edge; issues no grants; runs no policy decisions.
|
|
46
49
|
|
|
47
50
|
[](LICENSE)
|
|
@@ -55,11 +58,41 @@ Dynamic: license-file
|
|
|
55
58
|
[](docs/SDK_SELECTION_GUIDE.md)
|
|
56
59
|
[](https://github.com/Actenon/actenon-kernel/actions/workflows/ci.yml)
|
|
57
60
|
[](https://github.com/Actenon/actenon-kernel/actions/workflows/invariants.yml)
|
|
61
|
+
[](https://github.com/Actenon/actenon-kernel/actions/workflows/verify-claims.yml)
|
|
62
|
+
[](docs/integrations/MCP_QUICKSTART.md)
|
|
58
63
|
[](https://docs.astral.sh/ruff/)
|
|
59
64
|
[](#independence)
|
|
60
65
|
[](tests/test_neutrality.py)
|
|
61
66
|
[](tests/test_independence.py)
|
|
62
67
|
|
|
68
|
+
### Every claim above is machine-verified
|
|
69
|
+
|
|
70
|
+
The `claims: machine-verified` badge links to a CI gate
|
|
71
|
+
([`verify-claims.yml`](.github/workflows/verify-claims.yml)) that fails on
|
|
72
|
+
every PR, push to `main`, and once a day if any factual claim this README
|
|
73
|
+
makes about the kernel stops being true:
|
|
74
|
+
|
|
75
|
+
- **Zero network calls during verification** — [`tests/test_neutrality.py`](tests/test_neutrality.py)
|
|
76
|
+
runs in the gate, not just behind a badge link.
|
|
77
|
+
- **Runs without Permit, Cloud, or Scan** — [`tests/test_independence.py`](tests/test_independence.py),
|
|
78
|
+
plus a source scan proving the kernel never imports Cloud or Permit, plus
|
|
79
|
+
[`scripts/assert_dep_direction.py`](scripts/assert_dep_direction.py)
|
|
80
|
+
(runtime deps are exactly `actenon-protocol`).
|
|
81
|
+
- **The conformance count** — "51 conformance vectors" is compared against
|
|
82
|
+
what `actenon-kernel conformance run` actually executes; the vector files
|
|
83
|
+
themselves are hash-locked by
|
|
84
|
+
[`scripts/verify_conformance_manifest.py`](scripts/verify_conformance_manifest.py).
|
|
85
|
+
- **Install commands** — every `pip install` in this README is resolved
|
|
86
|
+
against the live registry; the Python badge is generated, not hand-edited.
|
|
87
|
+
- **The ecosystem table** — rendered from the protocol's `ecosystem.yaml`,
|
|
88
|
+
never hand-edited.
|
|
89
|
+
|
|
90
|
+
The [Invariants](.github/workflows/invariants.yml) workflow additionally
|
|
91
|
+
proves on every PR that a clean, no-extras install verifies the full
|
|
92
|
+
conformance surface — 33/33 tests, zero skips — including Ed25519.
|
|
93
|
+
|
|
94
|
+
If a claim drifts, the badge goes red before a human notices.
|
|
95
|
+
|
|
63
96
|
---
|
|
64
97
|
|
|
65
98
|
## The Actenon ecosystem
|
|
@@ -189,10 +222,44 @@ For deployments that need portable cryptographic attestation of origin, the Kern
|
|
|
189
222
|
Python 3.10+ for the Kernel alone. The full stack including Permit requires 3.11+.
|
|
190
223
|
|
|
191
224
|
```bash
|
|
192
|
-
pip install actenon-kernel #
|
|
193
|
-
|
|
225
|
+
pip install actenon-kernel # full verifier: HMAC and Ed25519
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
Since 1.1.0 the base install verifies everything the ecosystem produces,
|
|
229
|
+
including Ed25519 proofs and Outcome Attestations. (The `[asymmetric]` extra
|
|
230
|
+
still resolves for backward compatibility; it installs nothing additional.)
|
|
231
|
+
|
|
232
|
+
## Connect it to an agent (MCP, 60 seconds, zero install)
|
|
233
|
+
|
|
234
|
+
The Kernel ships a runnable MCP server, so a model can ask it whether an
|
|
235
|
+
action is allowed *before* the action runs — and read back exactly why it was
|
|
236
|
+
refused. Paste this into any MCP client (Claude Desktop, ChatGPT, or anything
|
|
237
|
+
else that speaks MCP):
|
|
238
|
+
|
|
239
|
+
```json
|
|
240
|
+
{
|
|
241
|
+
"mcpServers": {
|
|
242
|
+
"actenon": {
|
|
243
|
+
"command": "uvx",
|
|
244
|
+
"args": ["--from", "actenon-kernel[mcp]", "actenon-mcp", "--demo"]
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
194
248
|
```
|
|
195
249
|
|
|
250
|
+
`uvx` fetches and runs it — nothing to install first. `--demo` runs offline
|
|
251
|
+
with an ephemeral key and in-memory state; it is clearly marked **DEMO MODE**
|
|
252
|
+
in every tool description and must not be used in production.
|
|
253
|
+
|
|
254
|
+
Three tools: `actenon_verify` (is this proof good for this exact action?),
|
|
255
|
+
`actenon_gate` (ALLOW or a typed refusal), `actenon_receipt` (the
|
|
256
|
+
hash-chained receipt for a prior decision). Every refusal carries both the
|
|
257
|
+
machine code and the human-readable reason.
|
|
258
|
+
|
|
259
|
+
Full walkthrough, including a real transcript of an agent being refused for
|
|
260
|
+
widening a refund and then succeeding within scope:
|
|
261
|
+
[`docs/integrations/MCP_QUICKSTART.md`](docs/integrations/MCP_QUICKSTART.md).
|
|
262
|
+
|
|
196
263
|
## Use as a verifier (resource boundary)
|
|
197
264
|
|
|
198
265
|
```python
|
|
@@ -235,7 +302,7 @@ result = verifier.verify_boundary(BoundaryVerificationRequest(
|
|
|
235
302
|
## Use as a minter + executor (brokered mode, full local proof)
|
|
236
303
|
|
|
237
304
|
```bash
|
|
238
|
-
python3 -m pip install -e
|
|
305
|
+
python3 -m pip install -e .
|
|
239
306
|
python3 -m actenon.cli up
|
|
240
307
|
python3 -m actenon.cli doctor
|
|
241
308
|
python3 -m actenon.cli simulate --incident replit
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Actenon Kernel
|
|
2
2
|
|
|
3
|
+
<!-- mcp-name: io.github.actenon/kernel -->
|
|
4
|
+
|
|
3
5
|
> The open verifier for proof-bound consequential execution. Defines what a valid proof is. Verifies proofs at the execution edge; issues no grants; runs no policy decisions.
|
|
4
6
|
|
|
5
7
|
[](LICENSE)
|
|
@@ -13,11 +15,41 @@
|
|
|
13
15
|
[](docs/SDK_SELECTION_GUIDE.md)
|
|
14
16
|
[](https://github.com/Actenon/actenon-kernel/actions/workflows/ci.yml)
|
|
15
17
|
[](https://github.com/Actenon/actenon-kernel/actions/workflows/invariants.yml)
|
|
18
|
+
[](https://github.com/Actenon/actenon-kernel/actions/workflows/verify-claims.yml)
|
|
19
|
+
[](docs/integrations/MCP_QUICKSTART.md)
|
|
16
20
|
[](https://docs.astral.sh/ruff/)
|
|
17
21
|
[](#independence)
|
|
18
22
|
[](tests/test_neutrality.py)
|
|
19
23
|
[](tests/test_independence.py)
|
|
20
24
|
|
|
25
|
+
### Every claim above is machine-verified
|
|
26
|
+
|
|
27
|
+
The `claims: machine-verified` badge links to a CI gate
|
|
28
|
+
([`verify-claims.yml`](.github/workflows/verify-claims.yml)) that fails on
|
|
29
|
+
every PR, push to `main`, and once a day if any factual claim this README
|
|
30
|
+
makes about the kernel stops being true:
|
|
31
|
+
|
|
32
|
+
- **Zero network calls during verification** — [`tests/test_neutrality.py`](tests/test_neutrality.py)
|
|
33
|
+
runs in the gate, not just behind a badge link.
|
|
34
|
+
- **Runs without Permit, Cloud, or Scan** — [`tests/test_independence.py`](tests/test_independence.py),
|
|
35
|
+
plus a source scan proving the kernel never imports Cloud or Permit, plus
|
|
36
|
+
[`scripts/assert_dep_direction.py`](scripts/assert_dep_direction.py)
|
|
37
|
+
(runtime deps are exactly `actenon-protocol`).
|
|
38
|
+
- **The conformance count** — "51 conformance vectors" is compared against
|
|
39
|
+
what `actenon-kernel conformance run` actually executes; the vector files
|
|
40
|
+
themselves are hash-locked by
|
|
41
|
+
[`scripts/verify_conformance_manifest.py`](scripts/verify_conformance_manifest.py).
|
|
42
|
+
- **Install commands** — every `pip install` in this README is resolved
|
|
43
|
+
against the live registry; the Python badge is generated, not hand-edited.
|
|
44
|
+
- **The ecosystem table** — rendered from the protocol's `ecosystem.yaml`,
|
|
45
|
+
never hand-edited.
|
|
46
|
+
|
|
47
|
+
The [Invariants](.github/workflows/invariants.yml) workflow additionally
|
|
48
|
+
proves on every PR that a clean, no-extras install verifies the full
|
|
49
|
+
conformance surface — 33/33 tests, zero skips — including Ed25519.
|
|
50
|
+
|
|
51
|
+
If a claim drifts, the badge goes red before a human notices.
|
|
52
|
+
|
|
21
53
|
---
|
|
22
54
|
|
|
23
55
|
## The Actenon ecosystem
|
|
@@ -147,10 +179,44 @@ For deployments that need portable cryptographic attestation of origin, the Kern
|
|
|
147
179
|
Python 3.10+ for the Kernel alone. The full stack including Permit requires 3.11+.
|
|
148
180
|
|
|
149
181
|
```bash
|
|
150
|
-
pip install actenon-kernel #
|
|
151
|
-
|
|
182
|
+
pip install actenon-kernel # full verifier: HMAC and Ed25519
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
Since 1.1.0 the base install verifies everything the ecosystem produces,
|
|
186
|
+
including Ed25519 proofs and Outcome Attestations. (The `[asymmetric]` extra
|
|
187
|
+
still resolves for backward compatibility; it installs nothing additional.)
|
|
188
|
+
|
|
189
|
+
## Connect it to an agent (MCP, 60 seconds, zero install)
|
|
190
|
+
|
|
191
|
+
The Kernel ships a runnable MCP server, so a model can ask it whether an
|
|
192
|
+
action is allowed *before* the action runs — and read back exactly why it was
|
|
193
|
+
refused. Paste this into any MCP client (Claude Desktop, ChatGPT, or anything
|
|
194
|
+
else that speaks MCP):
|
|
195
|
+
|
|
196
|
+
```json
|
|
197
|
+
{
|
|
198
|
+
"mcpServers": {
|
|
199
|
+
"actenon": {
|
|
200
|
+
"command": "uvx",
|
|
201
|
+
"args": ["--from", "actenon-kernel[mcp]", "actenon-mcp", "--demo"]
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
152
205
|
```
|
|
153
206
|
|
|
207
|
+
`uvx` fetches and runs it — nothing to install first. `--demo` runs offline
|
|
208
|
+
with an ephemeral key and in-memory state; it is clearly marked **DEMO MODE**
|
|
209
|
+
in every tool description and must not be used in production.
|
|
210
|
+
|
|
211
|
+
Three tools: `actenon_verify` (is this proof good for this exact action?),
|
|
212
|
+
`actenon_gate` (ALLOW or a typed refusal), `actenon_receipt` (the
|
|
213
|
+
hash-chained receipt for a prior decision). Every refusal carries both the
|
|
214
|
+
machine code and the human-readable reason.
|
|
215
|
+
|
|
216
|
+
Full walkthrough, including a real transcript of an agent being refused for
|
|
217
|
+
widening a refund and then succeeding within scope:
|
|
218
|
+
[`docs/integrations/MCP_QUICKSTART.md`](docs/integrations/MCP_QUICKSTART.md).
|
|
219
|
+
|
|
154
220
|
## Use as a verifier (resource boundary)
|
|
155
221
|
|
|
156
222
|
```python
|
|
@@ -193,7 +259,7 @@ result = verifier.verify_boundary(BoundaryVerificationRequest(
|
|
|
193
259
|
## Use as a minter + executor (brokered mode, full local proof)
|
|
194
260
|
|
|
195
261
|
```bash
|
|
196
|
-
python3 -m pip install -e
|
|
262
|
+
python3 -m pip install -e .
|
|
197
263
|
python3 -m actenon.cli up
|
|
198
264
|
python3 -m actenon.cli doctor
|
|
199
265
|
python3 -m actenon.cli simulate --incident replit
|
|
@@ -313,9 +313,11 @@ def _print_simulation_report(*, args: argparse.Namespace, report) -> None:
|
|
|
313
313
|
print(f" Artifacts: {result['artifact_dir']}")
|
|
314
314
|
if result.get("summary_path") is not None:
|
|
315
315
|
print(f" Incident summary: {result['summary_path']}")
|
|
316
|
-
|
|
316
|
+
# Incident results carry a different shape than scenario results
|
|
317
|
+
# and may omit these keys entirely.
|
|
318
|
+
if result.get("refusal_code") is not None:
|
|
317
319
|
print(f" Refusal code: {result['refusal_code']}")
|
|
318
|
-
if result
|
|
320
|
+
if result.get("receipt_id") is not None:
|
|
319
321
|
print(f" Receipt: {result['receipt_id']}")
|
|
320
322
|
if result.get("perspectives"):
|
|
321
323
|
print(" Perspectives:")
|
|
@@ -27,7 +27,7 @@ def _load(relative_path: str) -> dict[str, object]:
|
|
|
27
27
|
|
|
28
28
|
@unittest.skipUnless(
|
|
29
29
|
find_spec("cryptography") is not None,
|
|
30
|
-
"receipt counter-signature conformance requires the '
|
|
30
|
+
"receipt counter-signature conformance requires the 'cryptography' package (a base dependency since 1.1.0)",
|
|
31
31
|
)
|
|
32
32
|
class CounterSignatureConformanceTests(unittest.TestCase):
|
|
33
33
|
def test_valid_historical_kid_verifies_offline(self) -> None:
|
|
@@ -32,7 +32,7 @@ def _load(relative_path: str) -> dict[str, object]:
|
|
|
32
32
|
|
|
33
33
|
@unittest.skipUnless(
|
|
34
34
|
find_spec("cryptography") is not None,
|
|
35
|
-
"transparency-log conformance requires the '
|
|
35
|
+
"transparency-log conformance requires the 'cryptography' package (a base dependency since 1.1.0)",
|
|
36
36
|
)
|
|
37
37
|
class TransparencyLogConformanceTests(unittest.TestCase):
|
|
38
38
|
def test_checkpoint_rotation_inclusion_and_consistency_verify_offline(self) -> None:
|
|
@@ -30,7 +30,7 @@ def _load(relative_path: str) -> dict[str, object]:
|
|
|
30
30
|
|
|
31
31
|
@unittest.skipUnless(
|
|
32
32
|
find_spec("cryptography") is not None,
|
|
33
|
-
"trust-artifact conformance requires the '
|
|
33
|
+
"trust-artifact conformance requires the 'cryptography' package (a base dependency since 1.1.0)",
|
|
34
34
|
)
|
|
35
35
|
class TrustArtifactConformanceTests(unittest.TestCase):
|
|
36
36
|
def test_good_status_and_exact_action_approval_verify(self) -> None:
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import base64
|
|
4
|
+
import gc
|
|
4
5
|
import hashlib
|
|
5
6
|
import json
|
|
6
7
|
import shutil
|
|
@@ -2740,6 +2741,32 @@ def _simulate_replay_refused(scenario_dir: Path) -> SimulationScenarioResult:
|
|
|
2740
2741
|
)
|
|
2741
2742
|
|
|
2742
2743
|
|
|
2744
|
+
def _stabilize_sqlite_state(paths: LocalRuntimePaths) -> None:
|
|
2745
|
+
"""Settle SQLite files under the runtime root before they are hashed.
|
|
2746
|
+
|
|
2747
|
+
Replay stores may hold connections whose WAL content is checkpointed
|
|
2748
|
+
into the main database file only when the connection is finalized —
|
|
2749
|
+
which CPython may do at any point, including between the manifest
|
|
2750
|
+
hash pass and the archive write. That produces a bundle whose
|
|
2751
|
+
``*.sqlite3`` bytes no longer match the manifest ("File hash
|
|
2752
|
+
mismatch: .../replay.sqlite3"). Collect garbage so lingering
|
|
2753
|
+
connections close now, then force a TRUNCATE checkpoint so every
|
|
2754
|
+
database file is complete and byte-stable before hashing.
|
|
2755
|
+
"""
|
|
2756
|
+
gc.collect()
|
|
2757
|
+
for db_path in sorted(paths.root.rglob("*.sqlite3")):
|
|
2758
|
+
try:
|
|
2759
|
+
connection = sqlite3.connect(db_path)
|
|
2760
|
+
try:
|
|
2761
|
+
connection.execute("PRAGMA wal_checkpoint(TRUNCATE);")
|
|
2762
|
+
finally:
|
|
2763
|
+
connection.close()
|
|
2764
|
+
except sqlite3.Error:
|
|
2765
|
+
# A corrupt or locked database is the verifier's finding to
|
|
2766
|
+
# report, not the exporter's to mask — hash whatever is there.
|
|
2767
|
+
continue
|
|
2768
|
+
|
|
2769
|
+
|
|
2743
2770
|
def export_local_runtime_bundle(
|
|
2744
2771
|
runtime_dir: str | Path | None = None,
|
|
2745
2772
|
*,
|
|
@@ -2760,6 +2787,7 @@ def export_local_runtime_bundle(
|
|
|
2760
2787
|
raise ValueError(f"bundle output already exists at {target}; pass --force to replace it")
|
|
2761
2788
|
_ensure_removed(target)
|
|
2762
2789
|
|
|
2790
|
+
_stabilize_sqlite_state(paths)
|
|
2763
2791
|
bundle_manifest = _build_bundle_manifest(paths)
|
|
2764
2792
|
|
|
2765
2793
|
target.parent.mkdir(parents=True, exist_ok=True)
|