capsule-engine 0.1.0__tar.gz → 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/PKG-INFO +3 -2
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/README.md +2 -1
- capsule_engine-0.2.0/capsule_engine/cli/engine_plugin.py +86 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/folds/record_type_coverage.py +3 -1
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/checks/caps.py +23 -2
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/engine.py +14 -12
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/history_state.py +9 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/report/live_history.py +18 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/report/replay.py +18 -4
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/report/result_from_folds.py +50 -0
- capsule_engine-0.2.0/capsule_engine/rulesets/__init__.py +13 -0
- capsule_engine-0.2.0/capsule_engine/rulesets/check.py +264 -0
- capsule_engine-0.2.0/capsule_engine/schemas/engine-ruleset-v0.json +87 -0
- capsule_engine-0.2.0/capsule_engine/schemas/vendor/external-check-input-v0.json +203 -0
- capsule_engine-0.2.0/capsule_engine/schemas/vendor/external-check-result-v0.json +123 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine.egg-info/PKG-INFO +3 -2
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine.egg-info/SOURCES.txt +8 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine.egg-info/entry_points.txt +1 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/pyproject.toml +3 -1
- capsule_engine-0.2.0/tests/test_engine_plugin.py +382 -0
- capsule_engine-0.2.0/tests/test_hold_a_ruling.py +126 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_spend_weekly_executed_acts.py +4 -4
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_window_held.py +14 -2
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/LICENSE +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/__init__.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/bundle_viewer/__init__.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/bundle_viewer/static/offline_shell.html +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/bundle_viewer/viewer.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/cli/__init__.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/cli/bundle_cmd.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/cli/console_cmd.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/cli/constraints_cmd.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/cli/format.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/cli/guard_cmds.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/cli/init_cmds.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/cli/main.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/cli/packs_cmds.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/cli/telemetry_cmd.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/cli/tenant_cmds.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/cli/verify_cmd.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/compiler/__init__.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/compiler/effect_model.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/compiler/vocabulary.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/console/__init__.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/console/api.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/console/components.css +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/console/console.css +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/console/console.html +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/console/console.js +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/console/gallery.html +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/console/server.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/console/tokens.css +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/conversation/__init__.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/conversation/capsules.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/conversation/exchange.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/conversation/merkle.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/conversation/session.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/envcompat.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/events/__init__.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/events/capsule.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/examples/__init__.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/examples/data/tau2_airline/LICENSE-tau2-bench +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/examples/data/tau2_airline/PROVENANCE.json +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/examples/data/tau2_airline/hand_labels.json +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/examples/data/tau2_airline/pilot1_live_gemini-2-5-flash_airline_shift1.jsonl +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/examples/data/tau2_airline/tau2_committed_claude-3-7-sonnet_airline_trial0.jsonl +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/examples/data/tau2_airline/tau2_committed_gpt-4-1-mini_airline_trial0.jsonl +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/examples/data/tau2_airline/tau2_committed_gpt-4-1_airline_trial0.jsonl +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/examples/data/tau2_airline/tau2_committed_o4-mini_airline_trial0.jsonl +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/examples/data/tau2_airline/tau2_conversations_claude-3-7-sonnet_airline_4trials.jsonl +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/examples/tau2_airline_reference.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/examples/tau2_conversation_exchange.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/folds/__init__.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/folds/account_core.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/folds/approval_latency.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/folds/catalog.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/folds/catalog_defs/actions.count_by_developer.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/folds/catalog_defs/actions.executed_count.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/folds/catalog_defs/actions.last_decision.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/folds/catalog_defs/counterparty.seen_before.v2.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/folds/catalog_defs/counterparty.seen_before.v3.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/folds/catalog_defs/counterparty.seen_before.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/folds/catalog_defs/disclosure.class_seen.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/folds/catalog_defs/disclosure.statement_seen.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/folds/catalog_defs/hold.active_exposure.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/folds/catalog_defs/spend.weekly.v2.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/folds/catalog_defs/spend.weekly.v3.1.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/folds/catalog_defs/spend.weekly.v3.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/folds/catalog_defs/spend.weekly.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/folds/counterparty_signals.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/folds/definition.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/folds/duration.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/folds/engine.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/folds/errors.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/folds/loader.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/folds/ordering.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/folds/paths.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/folds/reducers.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/folds/retention_continuity.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/folds/set_membership.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/folds/taxonomy.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/__init__.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/action.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/action_taxonomy.json +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/action_taxonomy_v2.json +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/action_taxonomy_v3.json +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/action_taxonomy_v4.json +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/action_taxonomy_v5.json +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/capsule.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/checks/__init__.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/checks/action_class_gate.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/checks/base.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/checks/channel_change.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/checks/commitment.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/checks/counterparty_identity_change.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/checks/counterparty_list.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/checks/counterparty_seen_before.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/checks/credential_pattern.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/checks/dedupe.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/checks/destination_rail.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/checks/field_change_count.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/checks/offer_expiry.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/checks/plan_containment.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/checks/price_floor.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/checks/promise_never.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/checks/promise_requires_approval.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/checks/recipient_role.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/checks/recurring_charge.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/checks/refundability.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/checks/release_on_acceptance.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/checks/required_disclosure.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/checks/single_commitment.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/checks/task_authority.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/checks/upfront_amount.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/checks/verify_before_dispatch.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/classes.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/plan.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/revocation.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/signing.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/statements.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/tool_call.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/__init__.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/action_class_gate.v1.1.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/action_class_gate.v1.2.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/action_class_gate.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/caps.v2.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/caps.v3.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/caps.v4.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/caps.v5.1.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/caps.v5.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/caps.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/caps_holds.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/channel_change.v1.1.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/channel_change.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/counterparty_identity_change.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/counterparty_list.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/counterparty_seen_before.v2.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/counterparty_seen_before.v3.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/counterparty_seen_before.v4.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/counterparty_seen_before.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/credential_pattern.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/dedupe.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/destination_rail.seller.v1.1.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/destination_rail.seller.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/destination_rail.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/hold_reconcile.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/material_fields_changed.v1.1.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/material_fields_changed.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/offer_expiry.v1.1.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/offer_expiry.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/offer_fields_changed.v1.1.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/offer_fields_changed.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/price_floor.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/promise_never.v1.1.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/promise_never.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/promise_requires_approval.v1.1.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/promise_requires_approval.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/recipient_role.seller.v1.1.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/recipient_role.seller.v1.2.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/recipient_role.seller.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/recipient_role.v1.1.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/recipient_role.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/recipient_seen_before.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/recurring_charge.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/refundability.v1.1.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/refundability.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/release_on_acceptance.seller.v1.1.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/release_on_acceptance.seller.v1.2.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/release_on_acceptance.seller.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/required_disclosure.v1.1.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/required_disclosure.v1.2.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/required_disclosure.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/single_commitment.seller.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/task_authority.v1.1.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/task_authority.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/upfront_amount.v1.1.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/upfront_amount.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/catalog_defs/verify_before_dispatch.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/definition.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/errors.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/loader.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/guards/wickets/retired.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/holds/__init__.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/holds/capsules.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/holds/engine.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/holds/errors.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/holds/policy.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/holds/scope.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/mcp/__init__.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/mcp/config.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/mcp/server.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/mcp/tools.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packaging.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/__init__.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/backfill_coverage.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/catalog/airline-engagement/AI-BOOTSTRAP.md +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/catalog/airline-engagement/folds/session_close.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/catalog/airline-engagement/pack.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/catalog/eu-ai-act/fixtures/trace/good_execution.json +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/catalog/eu-ai-act/fixtures/trace/oversight_declared.json +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/catalog/eu-ai-act/fixtures/trace/tampered_execution.json +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/catalog/eu-ai-act/fixtures/trace/trusted_issuer.jwk.json +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/catalog/eu-ai-act/obligations-pack-note.md +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/catalog/eu-ai-act/obligations-register.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/catalog/eu-ai-act/pack.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/catalog/eu-ai-act/register.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/catalog/eu-ai-act-deterministic/fixtures/synthetic_internal_assist_sample.jsonl +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/catalog/eu-ai-act-deterministic/pack.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/catalog/everyday/AI-BOOTSTRAP.md +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/catalog/everyday/fixtures/mini_ledger.jsonl +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/catalog/everyday/pack.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/catalog/payments-safety/AI-BOOTSTRAP.md +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/catalog/payments-safety/fixtures/mini_ledger.jsonl +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/catalog/payments-safety/folds/spend_weekly.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/catalog/payments-safety/pack.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/catalog/seller/fixtures/mini_ledger.jsonl +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/catalog/seller/pack.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/catalog/standard-vendor/AI-BOOTSTRAP.md +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/catalog/standard-vendor/folds/session_close.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/catalog/standard-vendor/pack.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/contract_diff.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/contract_validate.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/corpus_verify.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/enforce.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/errors.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/eu_ai_act_trace_field_map.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/install.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/loader.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/measurability_report.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/obligation_results.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/pins.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/schema.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/thresholds.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/trace_attainment.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/packs/trace_reader.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/policy/__init__.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/policy/activation.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/policy/catalog_defs/default.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/policy/catalog_defs/holds.yaml +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/policy/errors.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/policy/limits.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/policy/loader.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/policy/manifest.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/policy/profile.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/policy/resolve.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/register/__init__.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/register/compiler.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/register/errors.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/register/loader.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/register/schema.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/registry/__init__.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/registry/conventions.json +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/registry/conventions.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/registry/cpb_registry.json +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/report/__init__.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/report/build.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/report/coverage.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/report/errors.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/report/live_check.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/report/model.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/report/render.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/report/result.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/report/result_from_layers.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/report/sale_bundle.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/report/static/verify.js +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/schemas/evidence-contract-v0.json +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/schemas/vendor/epistemic-types.json +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/schemas/vendor/evidence-result-v0.json +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/telemetry/__init__.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/telemetry/consent.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/telemetry/events.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/telemetry/fixtures/synthetic_events.jsonl +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/telemetry/funnel.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/telemetry/record.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/telemetry/sink.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/telemetry/state.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine/tenants.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine.egg-info/dependency_links.txt +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine.egg-info/requires.txt +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/capsule_engine.egg-info/top_level.txt +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/setup.cfg +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_account_core_defork.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_action_class_gate.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_action_taxonomy_table.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_ask_declared_wickets.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_caps_authorised_maximum.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_caps_money_classes.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_caps_per_action_limit.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_caps_shipped_defaults.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_cli_bundle.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_cli_bundle_period.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_cli_bundle_with_viewer.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_cli_console.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_cli_format_coverage.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_cli_verify.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_compiler_effect_model.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_compiler_vocabulary.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_conformance_vectors.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_console_product_laws.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_console_server_product_laws.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_console_withheld_payloads.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_contract_cases.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_conversation_capsules.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_counterparty_list.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_counterparty_seen_before_carried_out.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_counterparty_seen_before_dry_run.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_counterparty_seen_before_no_payee.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_deal_bridge_scalar_fields.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_deal_bundle_reader.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_deal_id_from_chain_id.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_dedupe_cross_deal_repeat.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_dedupe_deal_act.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_dedupe_equivalence_key.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_dedupe_non_act_records.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_dedupe_refund_key.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_evidence_contract_schema.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_executed_acts_window.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_fold_approval_latency.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_fold_definition.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_fold_engine.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_fold_identity.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_fold_ordering.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_fold_record_type_coverage.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_fold_retention_continuity.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_fold_set_membership.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_fold_taxonomy.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_fold_vectors.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_folds_never_call_judge_harness.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_folds_package_namespace_exports.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_gate_rules_declared_ask.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_generate_go_packs.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_guard_configured_checks.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_guard_counterparty_seen_before.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_guard_dry_run.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_guard_escalate_disposition.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_guard_eur150k_bridge.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_guard_failure_semantics.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_guard_manifest_digest.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_guard_na_evidence.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_guard_plan_containment.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_history_act_counterparty.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_holds_capsules.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_holds_expiry.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_holds_reconcile.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_holds_reserve.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_import_order.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_listing_classes.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_live_history.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_live_history_untyped_acts.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_local_only_payload_fields.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_manifest_activation.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_mcp_backend_seam.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_mcp_schema.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_mcp_session.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_mcp_tools.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_no_capsule_ledger_imports.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_offer_expiry_no_proposal.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_operator_limits.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_pack_backfill_coverage.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_pack_catalog_refs.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_pack_decision_table.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_pack_default_disposition.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_pack_differential_concurrency.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_pack_eu_ai_act_deterministic.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_pack_eu_ai_act_trace.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_pack_everyday_acceptance.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_pack_everyday_account_holder_asks.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_pack_everyday_gold_labels.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_pack_everyday_rule_selectors.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_pack_everyday_rules_27.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_pack_everyday_sale_coverage.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_pack_everyday_wording.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_pack_loader.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_pack_obligation_judge_pin.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_pack_obligation_measurability.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_pack_outcomes_both_shapes_and_retail.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_pack_outcomes_schema.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_pack_payments_safety_acceptance.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_pack_payments_safety_p2_lifecycle.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_pack_pins.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_pack_scope_validator.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_pack_seller.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_pack_seller_acceptance.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_pack_seller_gold_labels.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_pack_taxonomy_pin.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_pack_topology_profiles.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_pack_without_caps.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_payee_fp_profile.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_pickup_area.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_plan_containment_check.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_plan_definition.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_platform_recipient_role.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_policy_manifest.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_policy_profile.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_price_floor_committed_bounds.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_real_seller_bundle.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_real_two_deal_bundle.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_record_taxonomy_gate.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_refund_never_blocks_spend_window.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_register_compiler.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_register_loader.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_register_obligations.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_registry_conventions.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_registry_grc_facets.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_release_on_acceptance.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_release_on_acceptance_history.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_repeat_disclosures.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_report_coverage.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_report_coverage_fixture.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_report_dry_run.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_report_guard_projection.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_report_manifest.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_report_proposed_caps_section.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_report_result.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_report_result_extension_slot.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_report_result_from_folds.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_report_result_from_layers.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_report_result_unknown_fixtures.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_report_two_arm_rendering.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_report_word_discipline.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_representing_bridge.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_ruleset_diff.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_sale_replay.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_sale_standalone_report.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_scalar_input_checks.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_seller_destination_rail_v1_1.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_seller_statements.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_seller_wickets.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_single_commitment.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_spend_weekly_reversals.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_tau2_airline_reference.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_tau2_airline_reference_coverage.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_tau2_conversation_exchange.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_telemetry.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_tenant_provisioning.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_typed_counterparty_target.py +0 -0
- {capsule_engine-0.1.0 → capsule_engine-0.2.0}/tests/test_wicket_definition.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: capsule-engine
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Summary: The thin single-node engine: guard, append-only fold compute, packs, policy activation, and the local console/report/bundle-viewer runtime for AI agent actions.
|
|
5
5
|
Author: Action State Group
|
|
6
6
|
License-Expression: Apache-2.0 AND MIT
|
|
@@ -39,7 +39,8 @@ console/report/bundle-viewer runtime.
|
|
|
39
39
|
pip install capsule-engine
|
|
40
40
|
```
|
|
41
41
|
|
|
42
|
-
It installs the `capsule_engine` package
|
|
42
|
+
It installs the `capsule_engine` package, the `capsule-engine` command and `capsulectl-engine`, a
|
|
43
|
+
capsulectl plugin (`capsulectl engine check --ruleset FILE`). Its dependencies,
|
|
43
44
|
`agent-action-capsule`, `checkpointed-local-log`, `capsule-emit`, `jsonschema` and `pyyaml`, come
|
|
44
45
|
from PyPI.
|
|
45
46
|
|
|
@@ -8,7 +8,8 @@ console/report/bundle-viewer runtime.
|
|
|
8
8
|
pip install capsule-engine
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
It installs the `capsule_engine` package
|
|
11
|
+
It installs the `capsule_engine` package, the `capsule-engine` command and `capsulectl-engine`, a
|
|
12
|
+
capsulectl plugin (`capsulectl engine check --ruleset FILE`). Its dependencies,
|
|
12
13
|
`agent-action-capsule`, `checkpointed-local-log`, `capsule-emit`, `jsonschema` and `pyyaml`, come
|
|
13
14
|
from PyPI.
|
|
14
15
|
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
"""`capsulectl-engine`: the engine as a capsulectl plugin (cli-plugin/v1).
|
|
3
|
+
|
|
4
|
+
On a trusted plugin root, capsulectl wires it up as `capsulectl engine`. On
|
|
5
|
+
the reserved `cli-plugin-metadata` argument it prints the handshake object
|
|
6
|
+
capsulectl checks (capsule-cli docs/PLUGINS.md). Its one subcommand,
|
|
7
|
+
`check --ruleset FILE`, reads one external-check-input/v0 on stdin and prints
|
|
8
|
+
one external-check-result/v0 (``rulesets/check.py``): exit 0 means a result
|
|
9
|
+
was printed, whatever its verdict; any other exit is a refusal, named on
|
|
10
|
+
stderr, with nothing on stdout. That is capsule-cli #137's rules-checker
|
|
11
|
+
contract too, so the same launcher pins as a deal profile's
|
|
12
|
+
`--rules-checker` with the command
|
|
13
|
+
`["<root>/capsulectl-engine", "check", "--ruleset", "FILE"]`, FILE an
|
|
14
|
+
absolute path (capsulectl does not set the checker's working directory).
|
|
15
|
+
|
|
16
|
+
capsulectl pins this launcher's bytes, and the launcher is a console-script
|
|
17
|
+
stub: the code it runs is the installed capsule-engine package, which the pin
|
|
18
|
+
does not cover. So a check's name/version (``record_type_coverage/1``) is
|
|
19
|
+
frozen once released, and a change to what it decides is a new version.
|
|
20
|
+
|
|
21
|
+
Install: `capsulectl plugin install ./capsulectl-engine`, pointing at the
|
|
22
|
+
console script the package installs.
|
|
23
|
+
"""
|
|
24
|
+
from __future__ import annotations
|
|
25
|
+
|
|
26
|
+
import argparse
|
|
27
|
+
import json
|
|
28
|
+
import sys
|
|
29
|
+
|
|
30
|
+
from .. import __version__
|
|
31
|
+
from ..rulesets import Refusal, check, encode_result, load_ruleset
|
|
32
|
+
|
|
33
|
+
__all__ = ["main"]
|
|
34
|
+
|
|
35
|
+
# capsulectl's pluginAPI constant (capsule-cli internal/cli/plugin.go).
|
|
36
|
+
PLUGIN_API = "cli-plugin/v1"
|
|
37
|
+
METADATA_ARG = "cli-plugin-metadata"
|
|
38
|
+
NAME = "engine"
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class _Parser(argparse.ArgumentParser):
|
|
42
|
+
"""A usage error is one line: capsulectl keeps a refusing checker's first
|
|
43
|
+
stderr line as its reason, and a usage block would start with "usage:"."""
|
|
44
|
+
|
|
45
|
+
def error(self, message: str):
|
|
46
|
+
self.exit(2, f"{self.prog}: {message}\n")
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _parser() -> argparse.ArgumentParser:
|
|
50
|
+
parser = _Parser(prog=f"capsulectl {NAME}", description="Recompute a ruleset's clauses on a record.")
|
|
51
|
+
sub = parser.add_subparsers(dest="command", required=True, parser_class=_Parser)
|
|
52
|
+
c = sub.add_parser(
|
|
53
|
+
"check",
|
|
54
|
+
help="check one external-check-input/v0 (stdin) against a ruleset",
|
|
55
|
+
description="Read one external-check-input/v0 on stdin and print one external-check-result/v0, "
|
|
56
|
+
"tier recomputed, with a finding for every clause of the ruleset.",
|
|
57
|
+
)
|
|
58
|
+
c.add_argument("--ruleset", required=True, metavar="FILE", help="an engine-ruleset/v0 file (JSON)")
|
|
59
|
+
return parser
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def main(argv: list[str] | None = None) -> int:
|
|
63
|
+
args = sys.argv[1:] if argv is None else argv
|
|
64
|
+
if args[:1] == [METADATA_ARG]:
|
|
65
|
+
handshake = {
|
|
66
|
+
"name": NAME,
|
|
67
|
+
"vendor": "capsule-engine (Action State Group)",
|
|
68
|
+
"version": __version__,
|
|
69
|
+
"plugin_api": PLUGIN_API,
|
|
70
|
+
"subcommands": ["check"],
|
|
71
|
+
}
|
|
72
|
+
sys.stdout.write(json.dumps(handshake) + "\n")
|
|
73
|
+
return 0
|
|
74
|
+
ns = _parser().parse_args(args)
|
|
75
|
+
try:
|
|
76
|
+
out = encode_result(check(load_ruleset(ns.ruleset), sys.stdin.buffer.read()))
|
|
77
|
+
except Refusal as exc:
|
|
78
|
+
print(f"capsulectl {NAME} check: {exc}", file=sys.stderr)
|
|
79
|
+
return 1
|
|
80
|
+
sys.stdout.buffer.write(out)
|
|
81
|
+
sys.stdout.flush()
|
|
82
|
+
return 0
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
if __name__ == "__main__":
|
|
86
|
+
raise SystemExit(main())
|
|
@@ -47,7 +47,9 @@ def evaluate_record_type_coverage(
|
|
|
47
47
|
seen: set[str] = set()
|
|
48
48
|
for record in records:
|
|
49
49
|
kind = get_path(record, kind_field, None)
|
|
50
|
-
|
|
50
|
+
# Only a string is a kind: a declared kind is one, and an object or
|
|
51
|
+
# list at the path (a foreign record) cannot be hashed into the set.
|
|
52
|
+
if isinstance(kind, str):
|
|
51
53
|
seen.add(kind)
|
|
52
54
|
|
|
53
55
|
present = frozenset(seen) & registered_kinds
|
|
@@ -54,6 +54,13 @@ asks rather than allows (``CheckOutcome.asks_when_unevaluated``). A per-action
|
|
|
54
54
|
limit the action exceeds still fails, and its evidence adds
|
|
55
55
|
``window_unreadable_count``.
|
|
56
56
|
|
|
57
|
+
A live check's history ledger writes a copy of an act that seals no
|
|
58
|
+
``spend_minor`` with no ``amount_minor``, and the stated amount beside it
|
|
59
|
+
(``STATED_AMOUNT``). The window reads that copy at the stated amount, never
|
|
60
|
+
below 0 (``_window_record``), so under a fold that reads the copy
|
|
61
|
+
(``spend.weekly/3.0.0`` and ``1.0.0``) an accepted act is never dropped from
|
|
62
|
+
the total (capsule-engine#214 hold A, ruling A).
|
|
63
|
+
|
|
57
64
|
A live check's history ledger that is not known to hold every act writes an
|
|
58
65
|
``incomplete`` record (``guards/history_state.py``) under the checked
|
|
59
66
|
record's operator. With one in the ledger the window total may leave out acts
|
|
@@ -77,7 +84,7 @@ from ...folds.engine import EvaluationTrace, ReversalSummary, evaluate_one
|
|
|
77
84
|
from ..action import Action
|
|
78
85
|
from ..capsule import ConstraintOutcome, not_applicable_evidence
|
|
79
86
|
from ..classes import resolve
|
|
80
|
-
from ..history_state import INCOMPLETE, WINDOW_HELD, history_state
|
|
87
|
+
from ..history_state import INCOMPLETE, STATED_AMOUNT, WINDOW_HELD, history_state
|
|
81
88
|
from .base import CheckOutcome
|
|
82
89
|
|
|
83
90
|
__all__ = [
|
|
@@ -253,6 +260,20 @@ def counts_executed_acts(definition: FoldDefinition | None) -> bool:
|
|
|
253
260
|
return False
|
|
254
261
|
|
|
255
262
|
|
|
263
|
+
def _window_record(capsule: dict) -> dict:
|
|
264
|
+
"""``capsule`` as the window reads it. A live history's copy of an act
|
|
265
|
+
that seals no ``spend_minor`` carries no ``amount_minor`` (its deal bridge
|
|
266
|
+
takes none), and a fold that reads that copy would skip it, leaving an
|
|
267
|
+
accepted act out of the total, where an under-count could allow. It is
|
|
268
|
+
read at the amount the act states (``STATED_AMOUNT``), never below 0
|
|
269
|
+
(capsule-engine#214 hold A, ruling A: under every fold, including the
|
|
270
|
+
frozen spend.weekly/3.0.0). Every other record is read as it is."""
|
|
271
|
+
payload = capsule.get("asg_payload")
|
|
272
|
+
if not isinstance(payload, dict) or "amount_minor" in payload or STATED_AMOUNT not in payload:
|
|
273
|
+
return capsule
|
|
274
|
+
return {**capsule, "asg_payload": {**payload, "amount_minor": max(payload[STATED_AMOUNT], 0)}}
|
|
275
|
+
|
|
276
|
+
|
|
256
277
|
def _unreadable_in_window(definition: FoldDefinition, records: list[dict], key_value: str | None, as_of: str) -> int:
|
|
257
278
|
"""How many executed acts with a spend that could not be read fall in
|
|
258
279
|
``definition``'s window under ``key_value``: the same key, window and
|
|
@@ -357,7 +378,7 @@ def check_caps(
|
|
|
357
378
|
)
|
|
358
379
|
|
|
359
380
|
key_value, query = _fold_key(action, definition.key, since)
|
|
360
|
-
records = [r.capsule for r in ledger.scan(query)]
|
|
381
|
+
records = [_window_record(r.capsule) for r in ledger.scan(query)]
|
|
361
382
|
anchor = as_of or action.resolved_timestamp()
|
|
362
383
|
trace = evaluate_one(definition, records, key_value=key_value, as_of=anchor)
|
|
363
384
|
unreadable = _unreadable_in_window(definition, records, key_value, anchor) if counts_executed_acts(definition) else 0
|
|
@@ -36,8 +36,8 @@ A check that could not be evaluated and asks (``CheckOutcome.asks_when_unevaluat
|
|
|
36
36
|
is recorded ``n/a`` in scope, and an action that would be allowed is asked
|
|
37
37
|
about instead, or refused when its class names no approver. It is never
|
|
38
38
|
allowed on a total that is not known, and it is not refused for that alone.
|
|
39
|
-
With no constraint failed its ``verdict`` is
|
|
40
|
-
(``GuardDecision.asked_unevaluated_checks``).
|
|
39
|
+
With no constraint failed its ``verdict`` is the escalation when it asks, and
|
|
40
|
+
``not_evaluable`` when it is refused (``GuardDecision.asked_unevaluated_checks``).
|
|
41
41
|
"""
|
|
42
42
|
from __future__ import annotations
|
|
43
43
|
|
|
@@ -155,16 +155,18 @@ class GuardDecision:
|
|
|
155
155
|
def verdict(self) -> str:
|
|
156
156
|
"""``outcome``, except that a decision refused only because its
|
|
157
157
|
class-keyed checks were left unevaluated (``taxonomy_mismatch``), its
|
|
158
|
-
deal could not be read (``deal_id_conflict``)
|
|
159
|
-
closed could not be evaluated (``not_evaluated_checks``)
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
if
|
|
158
|
+
deal could not be read (``deal_id_conflict``), a check that fails
|
|
159
|
+
closed could not be evaluated (``not_evaluated_checks``) or a check
|
|
160
|
+
that asks could not be evaluated (``asked_unevaluated_checks``) and
|
|
161
|
+
its class names no approver, with no constraint failed, is
|
|
162
|
+
``not_evaluable``. A decision asked about only because a check that
|
|
163
|
+
asks could not be evaluated keeps its outcome, ``escalate``: it asks
|
|
164
|
+
for approval (#217)."""
|
|
165
|
+
if any(c.result == "fail" for c in self.constraints):
|
|
166
|
+
return self.outcome
|
|
167
|
+
if self.taxonomy_mismatch is not None or self.deal_id_conflict is not None or self.not_evaluated_checks:
|
|
168
|
+
return NOT_EVALUABLE
|
|
169
|
+
if self.asked_unevaluated_checks and self.outcome != ESCALATE:
|
|
168
170
|
return NOT_EVALUABLE
|
|
169
171
|
return self.outcome
|
|
170
172
|
|
|
@@ -48,6 +48,7 @@ __all__ = [
|
|
|
48
48
|
"LIVE_HISTORY",
|
|
49
49
|
"NO_DISPOSITION",
|
|
50
50
|
"RULES_HISTORY_DAYS",
|
|
51
|
+
"STATED_AMOUNT",
|
|
51
52
|
"STATEMENT",
|
|
52
53
|
"CHECK_FP_ALGS",
|
|
53
54
|
"COUNTERPARTY_KINDS",
|
|
@@ -69,6 +70,14 @@ STATEMENT = "statement"
|
|
|
69
70
|
INCOMPLETE = "incomplete"
|
|
70
71
|
WINDOW_HELD = "window_held"
|
|
71
72
|
THREAD_COUNTERPARTY = "thread_counterparty"
|
|
73
|
+
# The amount a history act states (its body's amount_minor) when it seals no
|
|
74
|
+
# spend_minor: the history copy's own amount_minor is the spend its deal
|
|
75
|
+
# bridge takes, so it has none, and a caps window that reads the copy counts
|
|
76
|
+
# this in its place (caps.py, capsule-engine#214 hold A, ruling A: an
|
|
77
|
+
# accepted act with no spend_minor counts at its stated amount under every
|
|
78
|
+
# fold). Like THREAD_COUNTERPARTY it is this ledger's own state, never in
|
|
79
|
+
# act_payload, so no decision seals it and dedupe never reads it.
|
|
80
|
+
STATED_AMOUNT = "stated_amount_minor"
|
|
72
81
|
# How far back a live check's history reaches: capsulectl sends the acts
|
|
73
82
|
# sealed in the last 31 days (capsule-cli internal/cli RulesHistoryDays,
|
|
74
83
|
# plugins/internal/plugin/rules_checker.go rulesHistory). A replay of a sale
|
|
@@ -41,6 +41,10 @@ history is missing, is not a list, is not declared complete, or holds an
|
|
|
41
41
|
entry with no readable time or an ``item_ref`` in another shape, one
|
|
42
42
|
``incomplete`` record is written after the acts.
|
|
43
43
|
|
|
44
|
+
An act that seals no ``spend_minor`` has no amount in its record, as its
|
|
45
|
+
deal bridge takes none, so the record also carries the amount the act states
|
|
46
|
+
(``STATED_AMOUNT``), which a caps window counts in its place (#214 hold A).
|
|
47
|
+
|
|
44
48
|
Under a caps fold that counts executed acts (``spend.weekly/3.1.0``), each act
|
|
45
49
|
is also written as the spend window's record of it (``ExecutedActs``), right
|
|
46
50
|
after it: every history entry is an executed act, counted once. An entry
|
|
@@ -74,6 +78,7 @@ from ..guards.history_state import (
|
|
|
74
78
|
INCOMPLETE,
|
|
75
79
|
LIVE_HISTORY,
|
|
76
80
|
NO_DISPOSITION,
|
|
81
|
+
STATED_AMOUNT,
|
|
77
82
|
STATEMENT,
|
|
78
83
|
THREAD_COUNTERPARTY,
|
|
79
84
|
UNREAD,
|
|
@@ -246,6 +251,9 @@ def _act_record(entry: dict) -> _HistoryRecord:
|
|
|
246
251
|
payload["item_ref"] = item_ref
|
|
247
252
|
else:
|
|
248
253
|
payload = history_act_payload(action, sealed_disposition=decision is not None)
|
|
254
|
+
stated = _stated_amount(entry) if "amount_minor" not in payload else None
|
|
255
|
+
if stated is not None:
|
|
256
|
+
payload[STATED_AMOUNT] = stated
|
|
249
257
|
capsule_id = entry.get("capsule_id")
|
|
250
258
|
record = _HistoryRecord(
|
|
251
259
|
capsule_id=capsule_id if isinstance(capsule_id, str) and capsule_id else json_digest(entry),
|
|
@@ -261,6 +269,16 @@ def _act_record(entry: dict) -> _HistoryRecord:
|
|
|
261
269
|
return record
|
|
262
270
|
|
|
263
271
|
|
|
272
|
+
def _stated_amount(entry: dict) -> int | None:
|
|
273
|
+
"""The ``amount_minor`` a history act's body states, an integer, or
|
|
274
|
+
``None``: read where the act seals no ``spend_minor``, so its history
|
|
275
|
+
copy carries no amount, for a caps window to count in its place
|
|
276
|
+
(``STATED_AMOUNT``)."""
|
|
277
|
+
acted, unchecked = _act_member(bound_agent_input(entry))
|
|
278
|
+
amount = acted.get("amount_minor") if acted is not None and not unchecked else None
|
|
279
|
+
return amount if isinstance(amount, int) and not isinstance(amount, bool) else None
|
|
280
|
+
|
|
281
|
+
|
|
264
282
|
def history_act_payload(action: Action, *, sealed_disposition: bool) -> dict[str, object]:
|
|
265
283
|
"""The ``asg_payload`` ``history_ledger`` writes for a history act it
|
|
266
284
|
read: what a decision on ``action`` seals about the act (``act_payload``),
|
|
@@ -61,6 +61,14 @@ profile-wide and capped at 1,000 acts, and past the cap it reads
|
|
|
61
61
|
incomplete, so the acceptance is unknown. A share refused live for a
|
|
62
62
|
truncated history may therefore pass on replay of a complete bundle.
|
|
63
63
|
|
|
64
|
+
Live and replay can also differ by design under the frozen spend.weekly/3.0.0
|
|
65
|
+
(everyday 0.3.4/0.3.5): the live guard also counted readable undecided and
|
|
66
|
+
unchecked acts in the caps window, and replay follows the pinned text,
|
|
67
|
+
accepted acts only, so a cap failed live may pass on replay. Anything that
|
|
68
|
+
shows a user both must word that case as the live guard being stricter than
|
|
69
|
+
the pinned rule, never as a mismatch or as replay finding an error
|
|
70
|
+
(capsule-engine#214, Sherlock2's ruling, ops 3febd921).
|
|
71
|
+
|
|
64
72
|
``_bridge_transfer_funds`` is the other non-default action mapping, and it
|
|
65
73
|
mirrors the pattern already established by ``tests/test_guard_dry_run.py``
|
|
66
74
|
and ``tests/test_guard_eur150k_bridge.py``: ``transfer_funds`` capsules in
|
|
@@ -1326,17 +1334,23 @@ def _taken(shown: dict, *, every_record_is_an_act: bool) -> tuple[dict, bool] |
|
|
|
1326
1334
|
def _executed_spend(body: dict, *, unchecked: bool, accepted: bool) -> int | None:
|
|
1327
1335
|
"""The spend the act ``body`` states took, or ``None`` when it cannot be
|
|
1328
1336
|
read. Money moved in (``MONEY_IN``) is ``0``, decided or not, and a
|
|
1329
|
-
disclosure moves none. An accepted act is counted at its
|
|
1330
|
-
``amount_minor
|
|
1337
|
+
disclosure moves none. An accepted act is counted at the larger of its
|
|
1338
|
+
stated ``amount_minor`` and its ``spend_minor``, and at its
|
|
1339
|
+
``amount_minor``, never below 0, when it seals no ``spend_minor``
|
|
1340
|
+
(capsule-engine#214 hold A, ruling A): a partial charge keeps its stated
|
|
1341
|
+
amount, and a spend above it is never left out. An act taken
|
|
1331
1342
|
without a check is sealed before its spend is classed, so its
|
|
1332
1343
|
``amount_minor`` stands in for a missing ``spend_minor``. Any other act
|
|
1333
1344
|
is counted at its ``spend_minor``, which must be an integer of at least
|
|
1334
1345
|
0."""
|
|
1335
1346
|
if body.get("direction") == MONEY_IN or _DISCLOSED in body:
|
|
1336
1347
|
return 0
|
|
1337
|
-
if accepted:
|
|
1338
|
-
return _minor(body.get("amount_minor"))
|
|
1339
1348
|
spend = _minor(body.get("spend_minor"))
|
|
1349
|
+
if accepted:
|
|
1350
|
+
amount = _minor(body.get("amount_minor"))
|
|
1351
|
+
if amount is None:
|
|
1352
|
+
return None
|
|
1353
|
+
return max(amount, 0) if spend is None else max(amount, spend)
|
|
1340
1354
|
if unchecked:
|
|
1341
1355
|
return spend if spend is not None else _minor(body.get("amount_minor"))
|
|
1342
1356
|
return spend if spend is not None and spend >= 0 else None
|
|
@@ -11,6 +11,12 @@ until a real, non-stub, offline-verified witness stamp lands, then
|
|
|
11
11
|
that is the module's whole point -- "grade read from the bundle's
|
|
12
12
|
witness/countersign state, never asserted".
|
|
13
13
|
|
|
14
|
+
The ``finding_from_*`` adapters project the same fold outputs onto an
|
|
15
|
+
external-check-result/v0 finding (``Finding``) instead, for
|
|
16
|
+
``capsulectl engine check`` (``rulesets/``): met -> pass, not_met -> fail,
|
|
17
|
+
not_evaluable -> not_evaluable, and an exclusion -> not_applicable. A
|
|
18
|
+
finding's not_applicable is the exclusion only and never becomes a verdict.
|
|
19
|
+
|
|
14
20
|
``tier`` is always ``"recomputed"`` in this module: every fold in
|
|
15
21
|
``capsule_engine/folds/`` is a deterministic recomputation over sealed
|
|
16
22
|
records (this repo's own report/build.py docstring: "nothing in this module
|
|
@@ -23,6 +29,7 @@ has one.
|
|
|
23
29
|
from __future__ import annotations
|
|
24
30
|
|
|
25
31
|
from dataclasses import dataclass
|
|
32
|
+
from typing import Literal
|
|
26
33
|
|
|
27
34
|
from agent_action_capsule import json_digest
|
|
28
35
|
from capsule_emit.chain_segment import ChainSegment
|
|
@@ -32,9 +39,11 @@ from ..folds.retention_continuity import RetentionContinuityResult
|
|
|
32
39
|
from .result import Claim, DigestRef, DisclosureCarrier, ProofRef
|
|
33
40
|
|
|
34
41
|
__all__ = [
|
|
42
|
+
"Finding",
|
|
35
43
|
"GuardProjection",
|
|
36
44
|
"claim_from_guard_constraint",
|
|
37
45
|
"claim_from_retention_continuity",
|
|
46
|
+
"finding_from_record_type_coverage",
|
|
38
47
|
"is_excluded_not_applicable",
|
|
39
48
|
"project_guard_constraint",
|
|
40
49
|
]
|
|
@@ -103,6 +112,47 @@ def is_excluded_not_applicable(result: RecordTypeCoverageResult) -> bool:
|
|
|
103
112
|
return not result.applicable
|
|
104
113
|
|
|
105
114
|
|
|
115
|
+
@dataclass(frozen=True)
|
|
116
|
+
class Finding:
|
|
117
|
+
"""One external-check-result/v0 finding, before ``rulesets.check`` names
|
|
118
|
+
it (id, check, disposition). ``limit_source`` and ``profile_digest`` are
|
|
119
|
+
capsule-cli#257's members: printed only once the vendored result schema
|
|
120
|
+
lists them (``rulesets/check.py``), since an older capsulectl refuses a
|
|
121
|
+
member its schema does not list."""
|
|
122
|
+
|
|
123
|
+
verdict: Literal["pass", "fail", "not_applicable", "not_evaluable"]
|
|
124
|
+
reason: str | None = None
|
|
125
|
+
limit: int | str | None = None
|
|
126
|
+
value: int | str | None = None
|
|
127
|
+
limit_source: str | None = None
|
|
128
|
+
profile_digest: str | None = None
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def finding_from_record_type_coverage(result: RecordTypeCoverageResult, *, complete: bool) -> Finding:
|
|
132
|
+
"""Project one ``evaluate_record_type_coverage`` call into a finding.
|
|
133
|
+
``complete`` is whether the records it read are all there were
|
|
134
|
+
(external-check-input/v0 ``history_scope.complete``). A kind seen is seen
|
|
135
|
+
whatever else is missing, so an incomplete history still passes when every
|
|
136
|
+
declared kind is in it; a kind not seen in an incomplete history may be in
|
|
137
|
+
the part left out, so that is not_evaluable, never a fail. ``limit`` is
|
|
138
|
+
the number of kinds declared and ``value`` the number seen."""
|
|
139
|
+
if is_excluded_not_applicable(result):
|
|
140
|
+
return Finding(verdict="not_applicable", reason="no record kinds are declared")
|
|
141
|
+
declared = len(result.present) + len(result.missing)
|
|
142
|
+
counts = {"limit": declared, "value": len(result.present)}
|
|
143
|
+
if result.verdict == "met":
|
|
144
|
+
return Finding(verdict="pass", **counts)
|
|
145
|
+
missing = ", ".join(sorted(result.missing))
|
|
146
|
+
if not complete:
|
|
147
|
+
return Finding(verdict="not_evaluable", reason=_clip(f"the history is incomplete and does not show: {missing}"), **counts)
|
|
148
|
+
return Finding(verdict="fail", reason=_clip(f"not in the history: {missing}"), **counts)
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def _clip(reason: str) -> str:
|
|
152
|
+
# external-check-result/v0 caps a reason at 1000 characters.
|
|
153
|
+
return reason if len(reason) <= 1000 else reason[:997] + "..."
|
|
154
|
+
|
|
155
|
+
|
|
106
156
|
# A guard constraint record's result (pass | fail | n/a) projected onto the
|
|
107
157
|
# registered (EvidenceStatus, Sufficiency, Verdict) triple, beside the fold
|
|
108
158
|
# map above. pass/fail are settled; an n/a is read through the facts object
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
"""Rulesets for ``capsulectl engine check --ruleset FILE`` (capsule-engine#162).
|
|
3
|
+
|
|
4
|
+
An ``engine-ruleset/v0`` file names the clauses the engine recomputes on one
|
|
5
|
+
external-check-input/v0; ``check`` answers with one external-check-result/v0,
|
|
6
|
+
tier ``recomputed``. The format is ``schemas/engine-ruleset-v0.json``; its
|
|
7
|
+
``definition_digest`` is SHA-256 over the JCS bytes of the parsed document.
|
|
8
|
+
"""
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from .check import RULESET_FORMAT, Refusal, Ruleset, check, encode_result, load_ruleset
|
|
12
|
+
|
|
13
|
+
__all__ = ["RULESET_FORMAT", "Refusal", "Ruleset", "check", "encode_result", "load_ruleset"]
|