capsule-engine 0.2.0__tar.gz → 0.3.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.2.0 → capsule_engine-0.3.0}/PKG-INFO +6 -6
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/README.md +2 -2
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/__init__.py +3 -3
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/cli/bundle_cmd.py +2 -39
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/cli/format.py +2 -2
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/cli/guard_cmds.py +50 -52
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/cli/init_cmds.py +13 -12
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/cli/main.py +5 -8
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/cli/tenant_cmds.py +3 -3
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/cli/verify_cmd.py +31 -12
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/conversation/__init__.py +1 -1
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/conversation/capsules.py +16 -11
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/conversation/session.py +7 -9
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/examples/tau2_airline_reference.py +37 -49
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/__init__.py +1 -1
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/action.py +9 -1
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/capsule.py +2 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/__init__.py +35 -28
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/caps.py +13 -15
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/counterparty_identity_change.py +7 -8
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/counterparty_seen_before.py +7 -9
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/dedupe.py +5 -6
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/plan_containment.py +2 -2
- capsule_engine-0.3.0/capsule_engine/guards/checks/rate_cap.py +92 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/release_on_acceptance.py +8 -9
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/required_disclosure.py +12 -15
- capsule_engine-0.3.0/capsule_engine/guards/checks/required_fields.py +77 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/single_commitment.py +7 -9
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/verify_before_dispatch.py +6 -7
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/engine.py +27 -16
- capsule_engine-0.3.0/capsule_engine/guards/history.py +539 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/revocation.py +6 -6
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/tool_call.py +4 -6
- capsule_engine-0.3.0/capsule_engine/guards/wickets/catalog_defs/rate_cap.yaml +21 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/definition.py +2 -1
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/holds/engine.py +22 -23
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/holds/scope.py +2 -2
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/mcp/config.py +27 -28
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/mcp/server.py +4 -4
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/mcp/tools.py +54 -36
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/everyday/AI-BOOTSTRAP.md +3 -3
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/everyday/fixtures/mini_ledger.jsonl +45 -45
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/everyday/pack.yaml +20 -6
- capsule_engine-0.3.0/capsule_engine/packs/catalog/inference/pack.yaml +86 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/seller/fixtures/mini_ledger.jsonl +83 -83
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/seller/pack.yaml +9 -2
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/install.py +19 -10
- capsule_engine-0.3.0/capsule_engine/packs/obligation_results.py +141 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/schema.py +9 -4
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/policy/activation.py +6 -8
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/policy/limits.py +7 -8
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/policy/profile.py +34 -3
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/policy/resolve.py +26 -9
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/registry/conventions.json +1 -1
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/registry/conventions.py +1 -1
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/registry/cpb_registry.json +3 -3
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/report/__init__.py +6 -8
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/report/build.py +2 -2
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/report/live_check.py +28 -16
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/report/live_history.py +15 -17
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/report/model.py +58 -2
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/report/replay.py +187 -93
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/report/sale_bundle.py +2 -2
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/telemetry/events.py +3 -3
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/tenants.py +20 -16
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine.egg-info/PKG-INFO +6 -6
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine.egg-info/SOURCES.txt +9 -21
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine.egg-info/requires.txt +2 -2
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/pyproject.toml +10 -15
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_action_class_gate.py +1 -1
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_ask_declared_wickets.py +7 -7
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_caps_authorised_maximum.py +4 -4
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_caps_money_classes.py +1 -1
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_caps_per_action_limit.py +4 -4
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_cli_format_coverage.py +1 -1
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_cli_verify.py +4 -4
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_conformance_vectors.py +11 -1
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_conversation_capsules.py +10 -10
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_counterparty_list.py +5 -5
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_counterparty_seen_before_dry_run.py +4 -4
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_counterparty_seen_before_no_payee.py +4 -4
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_deal_bundle_reader.py +10 -12
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_deal_id_from_chain_id.py +3 -3
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_dedupe_deal_act.py +5 -5
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_dedupe_equivalence_key.py +3 -3
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_dedupe_non_act_records.py +2 -2
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_executed_acts_window.py +4 -4
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_fold_retention_continuity.py +1 -1
- capsule_engine-0.3.0/tests/test_gate_reasons_182.py +133 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_gate_rules_declared_ask.py +6 -6
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_generate_go_packs.py +29 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_guard_configured_checks.py +7 -7
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_guard_counterparty_seen_before.py +1 -1
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_guard_dry_run.py +2 -2
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_guard_escalate_disposition.py +1 -1
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_guard_eur150k_bridge.py +7 -5
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_guard_failure_semantics.py +22 -29
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_guard_manifest_digest.py +5 -5
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_guard_na_evidence.py +2 -2
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_guard_plan_containment.py +2 -2
- capsule_engine-0.3.0/tests/test_history.py +376 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_history_act_counterparty.py +4 -4
- capsule_engine-0.3.0/tests/test_history_reversal.py +136 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_hold_a_ruling.py +6 -6
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_holds_expiry.py +18 -18
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_holds_reconcile.py +8 -7
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_holds_reserve.py +14 -14
- capsule_engine-0.3.0/tests/test_inference_pack.py +183 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_listing_classes.py +4 -4
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_live_history.py +5 -5
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_live_history_untyped_acts.py +4 -4
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_local_only_payload_fields.py +8 -13
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_manifest_activation.py +4 -4
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_mcp_session.py +1 -1
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_mcp_tools.py +5 -4
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_no_capsule_ledger_imports.py +15 -8
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_operator_limits.py +7 -7
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_differential_concurrency.py +10 -8
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_everyday_acceptance.py +8 -8
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_everyday_account_holder_asks.py +5 -5
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_everyday_gold_labels.py +3 -3
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_everyday_rule_selectors.py +6 -6
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_everyday_rules_27.py +3 -2
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_everyday_sale_coverage.py +3 -3
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_payments_safety_acceptance.py +12 -14
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_payments_safety_p2_lifecycle.py +7 -9
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_seller.py +6 -6
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_seller_acceptance.py +10 -10
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_seller_gold_labels.py +3 -3
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_without_caps.py +5 -5
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_payee_fp_profile.py +6 -7
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_platform_recipient_role.py +7 -7
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_policy_profile.py +11 -11
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_price_floor_committed_bounds.py +3 -3
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_real_seller_bundle.py +4 -4
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_real_two_deal_bundle.py +4 -4
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_record_taxonomy_gate.py +5 -5
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_refund_never_blocks_spend_window.py +1 -1
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_registry_conventions.py +1 -1
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_release_on_acceptance.py +15 -11
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_release_on_acceptance_history.py +10 -10
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_repeat_disclosures.py +4 -4
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_report_dry_run.py +44 -114
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_report_manifest.py +4 -4
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_report_result_from_folds.py +1 -1
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_representing_bridge.py +5 -5
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_ruleset_diff.py +3 -3
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_sale_replay.py +7 -7
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_sale_standalone_report.py +1 -1
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_scalar_input_checks.py +1 -1
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_seller_destination_rail_v1_1.py +3 -3
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_seller_statements.py +5 -5
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_seller_wickets.py +4 -4
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_single_commitment.py +1 -1
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_spend_weekly_reversals.py +2 -2
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_tau2_airline_reference.py +9 -17
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_telemetry.py +4 -4
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_tenant_provisioning.py +10 -10
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_wicket_definition.py +2 -1
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_window_held.py +3 -3
- capsule_engine-0.2.0/capsule_engine/bundle_viewer/__init__.py +0 -21
- capsule_engine-0.2.0/capsule_engine/bundle_viewer/static/offline_shell.html +0 -1509
- capsule_engine-0.2.0/capsule_engine/bundle_viewer/viewer.py +0 -57
- capsule_engine-0.2.0/capsule_engine/cli/console_cmd.py +0 -70
- capsule_engine-0.2.0/capsule_engine/console/__init__.py +0 -10
- capsule_engine-0.2.0/capsule_engine/console/api.py +0 -251
- capsule_engine-0.2.0/capsule_engine/console/components.css +0 -406
- capsule_engine-0.2.0/capsule_engine/console/console.css +0 -130
- capsule_engine-0.2.0/capsule_engine/console/console.html +0 -51
- capsule_engine-0.2.0/capsule_engine/console/console.js +0 -330
- capsule_engine-0.2.0/capsule_engine/console/gallery.html +0 -274
- capsule_engine-0.2.0/capsule_engine/console/server.py +0 -137
- capsule_engine-0.2.0/capsule_engine/console/tokens.css +0 -68
- capsule_engine-0.2.0/capsule_engine/packs/obligation_results.py +0 -72
- capsule_engine-0.2.0/capsule_engine/report/render.py +0 -467
- capsule_engine-0.2.0/capsule_engine/report/static/verify.js +0 -451
- capsule_engine-0.2.0/tests/test_cli_bundle_with_viewer.py +0 -192
- capsule_engine-0.2.0/tests/test_cli_console.py +0 -199
- capsule_engine-0.2.0/tests/test_console_product_laws.py +0 -218
- capsule_engine-0.2.0/tests/test_console_server_product_laws.py +0 -121
- capsule_engine-0.2.0/tests/test_console_withheld_payloads.py +0 -89
- capsule_engine-0.2.0/tests/test_report_two_arm_rendering.py +0 -47
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/LICENSE +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/cli/__init__.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/cli/constraints_cmd.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/cli/engine_plugin.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/cli/packs_cmds.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/cli/telemetry_cmd.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/compiler/__init__.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/compiler/effect_model.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/compiler/vocabulary.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/conversation/exchange.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/conversation/merkle.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/envcompat.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/events/__init__.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/events/capsule.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/examples/__init__.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/examples/data/tau2_airline/LICENSE-tau2-bench +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/examples/data/tau2_airline/PROVENANCE.json +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/examples/data/tau2_airline/hand_labels.json +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/examples/data/tau2_airline/pilot1_live_gemini-2-5-flash_airline_shift1.jsonl +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/examples/data/tau2_airline/tau2_committed_claude-3-7-sonnet_airline_trial0.jsonl +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/examples/data/tau2_airline/tau2_committed_gpt-4-1-mini_airline_trial0.jsonl +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/examples/data/tau2_airline/tau2_committed_gpt-4-1_airline_trial0.jsonl +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/examples/data/tau2_airline/tau2_committed_o4-mini_airline_trial0.jsonl +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/examples/data/tau2_airline/tau2_conversations_claude-3-7-sonnet_airline_4trials.jsonl +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/examples/tau2_conversation_exchange.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/__init__.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/account_core.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/approval_latency.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/catalog.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/catalog_defs/actions.count_by_developer.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/catalog_defs/actions.executed_count.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/catalog_defs/actions.last_decision.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/catalog_defs/counterparty.seen_before.v2.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/catalog_defs/counterparty.seen_before.v3.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/catalog_defs/counterparty.seen_before.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/catalog_defs/disclosure.class_seen.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/catalog_defs/disclosure.statement_seen.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/catalog_defs/hold.active_exposure.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/catalog_defs/spend.weekly.v2.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/catalog_defs/spend.weekly.v3.1.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/catalog_defs/spend.weekly.v3.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/catalog_defs/spend.weekly.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/counterparty_signals.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/definition.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/duration.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/engine.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/errors.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/loader.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/ordering.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/paths.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/record_type_coverage.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/reducers.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/retention_continuity.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/set_membership.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/taxonomy.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/action_taxonomy.json +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/action_taxonomy_v2.json +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/action_taxonomy_v3.json +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/action_taxonomy_v4.json +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/action_taxonomy_v5.json +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/action_class_gate.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/base.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/channel_change.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/commitment.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/counterparty_list.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/credential_pattern.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/destination_rail.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/field_change_count.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/offer_expiry.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/price_floor.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/promise_never.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/promise_requires_approval.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/recipient_role.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/recurring_charge.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/refundability.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/task_authority.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/upfront_amount.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/classes.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/history_state.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/plan.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/signing.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/statements.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/__init__.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/action_class_gate.v1.1.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/action_class_gate.v1.2.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/action_class_gate.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/caps.v2.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/caps.v3.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/caps.v4.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/caps.v5.1.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/caps.v5.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/caps.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/caps_holds.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/channel_change.v1.1.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/channel_change.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/counterparty_identity_change.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/counterparty_list.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/counterparty_seen_before.v2.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/counterparty_seen_before.v3.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/counterparty_seen_before.v4.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/counterparty_seen_before.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/credential_pattern.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/dedupe.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/destination_rail.seller.v1.1.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/destination_rail.seller.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/destination_rail.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/hold_reconcile.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/material_fields_changed.v1.1.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/material_fields_changed.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/offer_expiry.v1.1.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/offer_expiry.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/offer_fields_changed.v1.1.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/offer_fields_changed.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/price_floor.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/promise_never.v1.1.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/promise_never.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/promise_requires_approval.v1.1.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/promise_requires_approval.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/recipient_role.seller.v1.1.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/recipient_role.seller.v1.2.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/recipient_role.seller.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/recipient_role.v1.1.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/recipient_role.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/recipient_seen_before.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/recurring_charge.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/refundability.v1.1.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/refundability.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/release_on_acceptance.seller.v1.1.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/release_on_acceptance.seller.v1.2.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/release_on_acceptance.seller.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/required_disclosure.v1.1.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/required_disclosure.v1.2.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/required_disclosure.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/single_commitment.seller.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/task_authority.v1.1.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/task_authority.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/upfront_amount.v1.1.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/upfront_amount.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/verify_before_dispatch.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/errors.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/loader.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/retired.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/holds/__init__.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/holds/capsules.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/holds/errors.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/holds/policy.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/mcp/__init__.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packaging.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/__init__.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/backfill_coverage.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/airline-engagement/AI-BOOTSTRAP.md +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/airline-engagement/folds/session_close.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/airline-engagement/pack.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/eu-ai-act/fixtures/trace/good_execution.json +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/eu-ai-act/fixtures/trace/oversight_declared.json +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/eu-ai-act/fixtures/trace/tampered_execution.json +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/eu-ai-act/fixtures/trace/trusted_issuer.jwk.json +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/eu-ai-act/obligations-pack-note.md +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/eu-ai-act/obligations-register.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/eu-ai-act/pack.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/eu-ai-act/register.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/eu-ai-act-deterministic/fixtures/synthetic_internal_assist_sample.jsonl +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/eu-ai-act-deterministic/pack.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/payments-safety/AI-BOOTSTRAP.md +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/payments-safety/fixtures/mini_ledger.jsonl +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/payments-safety/folds/spend_weekly.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/payments-safety/pack.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/standard-vendor/AI-BOOTSTRAP.md +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/standard-vendor/folds/session_close.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/standard-vendor/pack.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/contract_diff.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/contract_validate.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/corpus_verify.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/enforce.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/errors.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/eu_ai_act_trace_field_map.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/loader.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/measurability_report.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/pins.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/thresholds.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/trace_attainment.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/trace_reader.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/policy/__init__.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/policy/catalog_defs/default.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/policy/catalog_defs/holds.yaml +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/policy/errors.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/policy/loader.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/policy/manifest.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/register/__init__.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/register/compiler.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/register/errors.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/register/loader.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/register/schema.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/registry/__init__.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/report/coverage.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/report/errors.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/report/result.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/report/result_from_folds.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/report/result_from_layers.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/rulesets/__init__.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/rulesets/check.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/schemas/engine-ruleset-v0.json +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/schemas/evidence-contract-v0.json +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/schemas/vendor/epistemic-types.json +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/schemas/vendor/evidence-result-v0.json +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/schemas/vendor/external-check-input-v0.json +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/schemas/vendor/external-check-result-v0.json +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/telemetry/__init__.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/telemetry/consent.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/telemetry/fixtures/synthetic_events.jsonl +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/telemetry/funnel.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/telemetry/record.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/telemetry/sink.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/telemetry/state.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine.egg-info/dependency_links.txt +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine.egg-info/entry_points.txt +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine.egg-info/top_level.txt +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/setup.cfg +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_account_core_defork.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_action_taxonomy_table.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_caps_shipped_defaults.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_cli_bundle.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_cli_bundle_period.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_compiler_effect_model.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_compiler_vocabulary.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_contract_cases.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_counterparty_seen_before_carried_out.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_deal_bridge_scalar_fields.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_dedupe_cross_deal_repeat.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_dedupe_refund_key.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_engine_plugin.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_evidence_contract_schema.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_fold_approval_latency.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_fold_definition.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_fold_engine.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_fold_identity.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_fold_ordering.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_fold_record_type_coverage.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_fold_set_membership.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_fold_taxonomy.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_fold_vectors.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_folds_never_call_judge_harness.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_folds_package_namespace_exports.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_holds_capsules.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_import_order.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_mcp_backend_seam.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_mcp_schema.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_offer_expiry_no_proposal.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_backfill_coverage.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_catalog_refs.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_decision_table.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_default_disposition.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_eu_ai_act_deterministic.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_eu_ai_act_trace.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_everyday_wording.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_loader.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_obligation_judge_pin.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_obligation_measurability.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_outcomes_both_shapes_and_retail.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_outcomes_schema.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_pins.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_scope_validator.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_taxonomy_pin.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_topology_profiles.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pickup_area.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_plan_containment_check.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_plan_definition.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_policy_manifest.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_register_compiler.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_register_loader.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_register_obligations.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_registry_grc_facets.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_report_coverage.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_report_coverage_fixture.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_report_guard_projection.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_report_proposed_caps_section.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_report_result.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_report_result_extension_slot.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_report_result_from_layers.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_report_result_unknown_fixtures.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_report_word_discipline.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_spend_weekly_executed_acts.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_tau2_airline_reference_coverage.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_tau2_conversation_exchange.py +0 -0
- {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_typed_counterparty_target.py +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: capsule-engine
|
|
3
|
-
Version: 0.
|
|
4
|
-
Summary: The thin single-node engine: guard, append-only fold compute, packs, policy activation, and the
|
|
3
|
+
Version: 0.3.0
|
|
4
|
+
Summary: The thin single-node engine: guard, append-only fold compute, packs, policy activation, and the report computation for AI agent actions.
|
|
5
5
|
Author: Action State Group
|
|
6
6
|
License-Expression: Apache-2.0 AND MIT
|
|
7
7
|
Project-URL: Homepage, https://github.com/action-state-group/capsule-engine
|
|
@@ -14,9 +14,9 @@ Description-Content-Type: text/markdown
|
|
|
14
14
|
License-File: LICENSE
|
|
15
15
|
License-File: capsule_engine/examples/data/tau2_airline/LICENSE-tau2-bench
|
|
16
16
|
Requires-Dist: agent-action-capsule>=0.11.0
|
|
17
|
-
Requires-Dist: checkpointed-local-log
|
|
17
|
+
Requires-Dist: checkpointed-local-log<0.9,>=0.8.0
|
|
18
18
|
Requires-Dist: jsonschema>=4.18
|
|
19
|
-
Requires-Dist: capsule-emit
|
|
19
|
+
Requires-Dist: capsule-emit<0.15,>=0.14.0
|
|
20
20
|
Requires-Dist: pyyaml>=6.0
|
|
21
21
|
Provides-Extra: dev
|
|
22
22
|
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
@@ -32,8 +32,8 @@ Dynamic: license-file
|
|
|
32
32
|
# capsule-engine
|
|
33
33
|
|
|
34
34
|
The thin single-node enforcement layer for AI agent actions: the guard, append-only fold
|
|
35
|
-
compute, the Terms Packs runtime, policy activation, and the
|
|
36
|
-
|
|
35
|
+
compute, the Terms Packs runtime, policy activation, and the report computation
|
|
36
|
+
(pages are drawn by capsule-viewer).
|
|
37
37
|
|
|
38
38
|
```
|
|
39
39
|
pip install capsule-engine
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# capsule-engine
|
|
2
2
|
|
|
3
3
|
The thin single-node enforcement layer for AI agent actions: the guard, append-only fold
|
|
4
|
-
compute, the Terms Packs runtime, policy activation, and the
|
|
5
|
-
|
|
4
|
+
compute, the Terms Packs runtime, policy activation, and the report computation
|
|
5
|
+
(pages are drawn by capsule-viewer).
|
|
6
6
|
|
|
7
7
|
```
|
|
8
8
|
pip install capsule-engine
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
"""capsule-engine: the thin single-node engine -- guard, append-only fold
|
|
3
|
-
compute, packs, policy activation, and the
|
|
4
|
-
surfaces for AI agent actions.
|
|
5
|
-
|
|
3
|
+
compute, packs, policy activation, and the report
|
|
4
|
+
surfaces for AI agent actions. Records are stored in a checkpointed-local-log
|
|
5
|
+
entry log beside capsule-emit's artifact store (``guards/history.py``); the action-class registry is this
|
|
6
6
|
package's own ``registry``.
|
|
7
7
|
"""
|
|
8
8
|
|
|
@@ -41,7 +41,6 @@ from capsule_emit.ledger_io import (
|
|
|
41
41
|
require_ledger_path,
|
|
42
42
|
)
|
|
43
43
|
from capsule_emit.period import add_period_arg, apply_period
|
|
44
|
-
from cll.ledger.api import ScanQuery
|
|
45
44
|
|
|
46
45
|
from ..envcompat import env_get
|
|
47
46
|
from ..guards.capsule import local_only_refusal
|
|
@@ -63,29 +62,13 @@ def add_parser(sub: argparse._SubParsersAction) -> argparse.ArgumentParser:
|
|
|
63
62
|
default=env_get("CAPSULE_VERIFY_BASE_URL", DEFAULT_VERIFY_BASE_URL),
|
|
64
63
|
help="base URL the permalink's fragment is appended to (default: %(default)s)",
|
|
65
64
|
)
|
|
66
|
-
p.add_argument(
|
|
67
|
-
"--with-viewer",
|
|
68
|
-
dest="with_viewer",
|
|
69
|
-
action="store_true",
|
|
70
|
-
help=(
|
|
71
|
-
"also write a self-contained offline HTML viewer next to --out, so the "
|
|
72
|
-
"bundle verifies on a machine with no network (default viewer path: "
|
|
73
|
-
"--out with a .html extension)"
|
|
74
|
-
),
|
|
75
|
-
)
|
|
76
|
-
p.add_argument(
|
|
77
|
-
"--viewer-out",
|
|
78
|
-
dest="viewer_out",
|
|
79
|
-
default=None,
|
|
80
|
-
help="output path for the offline viewer HTML (implies --with-viewer; default: derived from --out)",
|
|
81
|
-
)
|
|
82
65
|
p.set_defaults(func=run)
|
|
83
66
|
return p
|
|
84
67
|
|
|
85
68
|
|
|
86
69
|
def _echo_safe_out(out: str) -> str:
|
|
87
70
|
"""The ``--out`` value ``cli_echo`` renders on the public bundle
|
|
88
|
-
permalink
|
|
71
|
+
permalink -- it must show where the file went
|
|
89
72
|
relative to the invocation, never the operator's absolute filesystem
|
|
90
73
|
layout. An absolute path outside the cwd tree (no relative route to it)
|
|
91
74
|
falls back to just the filename rather than leaking the full path."""
|
|
@@ -96,17 +79,6 @@ def _echo_safe_out(out: str) -> str:
|
|
|
96
79
|
return rel if not rel.startswith("..") else p.name
|
|
97
80
|
|
|
98
81
|
|
|
99
|
-
def _default_viewer_out(out: str) -> str:
|
|
100
|
-
"""``bundle.json`` -> ``bundle.html`` alongside it; falls back to a
|
|
101
|
-
``-viewer.html`` suffix on the rare path where ``--out`` already ends in
|
|
102
|
-
``.html`` (so the two outputs never collide)."""
|
|
103
|
-
p = Path(out)
|
|
104
|
-
candidate = p.with_suffix(".html")
|
|
105
|
-
if str(candidate) == out:
|
|
106
|
-
candidate = p.with_name(p.stem + "-viewer.html")
|
|
107
|
-
return str(candidate)
|
|
108
|
-
|
|
109
|
-
|
|
110
82
|
def _collect_with_parents(store, matched):
|
|
111
83
|
"""Pull in any cited chain parent not already selected, so the bundle
|
|
112
84
|
verifies standalone without needing the rest of the ledger. A parent
|
|
@@ -207,7 +179,7 @@ def run(args: argparse.Namespace) -> int:
|
|
|
207
179
|
}
|
|
208
180
|
all_ok = all_ok and result.ok
|
|
209
181
|
|
|
210
|
-
tree_size = sum(1 for _ in store.scan(
|
|
182
|
+
tree_size = sum(1 for _ in store.scan())
|
|
211
183
|
completeness_certificate = _build_completeness_certificate(store, records, tree_size)
|
|
212
184
|
|
|
213
185
|
echo = build_echo(
|
|
@@ -255,15 +227,6 @@ def run(args: argparse.Namespace) -> int:
|
|
|
255
227
|
print(f"checkpoint #{tree_size} · as of {format_staleness(0)}")
|
|
256
228
|
print(f"verify: {permalink}")
|
|
257
229
|
|
|
258
|
-
if args.with_viewer or args.viewer_out is not None:
|
|
259
|
-
from ..bundle_viewer import render_offline_viewer_html
|
|
260
|
-
|
|
261
|
-
viewer_out = args.viewer_out or _default_viewer_out(args.out)
|
|
262
|
-
viewer_html = render_offline_viewer_html(fragment)
|
|
263
|
-
with open(viewer_out, "w", encoding="utf-8") as fh:
|
|
264
|
-
fh.write(viewer_html)
|
|
265
|
-
print(f"wrote {viewer_out} (self-contained, opens with no network)")
|
|
266
|
-
|
|
267
230
|
print()
|
|
268
231
|
print(echo)
|
|
269
232
|
return 0 if all_ok else 1
|
|
@@ -111,8 +111,8 @@ def build_echo(verb: str, *, positional: str | None = None, flags: list[tuple[st
|
|
|
111
111
|
|
|
112
112
|
|
|
113
113
|
def cli_echo_leaks_absolute_path(cli_echo: str) -> bool:
|
|
114
|
-
"""``cli_echo`` is rendered verbatim on the bundle permalink
|
|
115
|
-
|
|
114
|
+
"""``cli_echo`` is rendered verbatim on the bundle permalink
|
|
115
|
+
-- a public URL -- so it must never carry an operator's
|
|
116
116
|
absolute filesystem layout (home directory, machine username). Flags any
|
|
117
117
|
token that is a POSIX absolute path (a leading ``/``, with no allowlisted
|
|
118
118
|
exception defined) or a Windows drive path (``C:\\...``); callers that
|
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
-
"""``capsule guard`` verbs: dry-run replay +
|
|
2
|
+
"""``capsule guard`` verbs: dry-run replay + JSON report (moved
|
|
3
3
|
here, matching ``fold_cmds.py``'s per-verb-module convention, so ``main.py``
|
|
4
4
|
stays a thin dispatcher), plus ``guard enforce`` -- a minimal, honest local
|
|
5
5
|
marker command (see ``_cmd_guard_enforce``'s own docstring for exactly what
|
|
6
6
|
it does and doesn't do).
|
|
7
7
|
|
|
8
8
|
Every guard-dry-run invocation here checks the current packaging arm
|
|
9
|
-
(``
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
prints a capsule id or a share/verify link -- see this module's inline
|
|
13
|
-
comments at each print site.
|
|
9
|
+
(``capsule_engine.packaging``) and, in "guards-only", rewords/suppresses this
|
|
10
|
+
command's own stdout so it never prints a capsule id -- see this module's
|
|
11
|
+
inline comments at each print site.
|
|
14
12
|
"""
|
|
15
13
|
from __future__ import annotations
|
|
16
14
|
|
|
17
15
|
import argparse
|
|
16
|
+
import json
|
|
18
17
|
import sys
|
|
19
18
|
from pathlib import Path
|
|
20
19
|
|
|
21
20
|
from .. import packaging
|
|
22
21
|
from ..envcompat import env_get
|
|
22
|
+
from ..guards.history import NotAStoreError
|
|
23
23
|
|
|
24
24
|
__all__ = ["add_parser"]
|
|
25
25
|
|
|
@@ -95,14 +95,28 @@ def _parse_cap_args(items: list[str]) -> dict[str, int] | None:
|
|
|
95
95
|
return caps_minor
|
|
96
96
|
|
|
97
97
|
|
|
98
|
+
def _report_payload(report, *, with_capsules: bool) -> dict:
|
|
99
|
+
"""The report as written to ``--out``. The sealed capsules in it are the
|
|
100
|
+
shareable part: kept only with ``--share`` (refused earlier when one is
|
|
101
|
+
local-only), otherwise the rows carry no capsule bodies."""
|
|
102
|
+
from ..report import to_payload
|
|
103
|
+
|
|
104
|
+
payload = to_payload(report)
|
|
105
|
+
if not with_capsules:
|
|
106
|
+
for section in payload["guards"]:
|
|
107
|
+
for row in section["rows"]:
|
|
108
|
+
row["capsule"] = None
|
|
109
|
+
row["cited_capsule"] = None
|
|
110
|
+
return payload
|
|
111
|
+
|
|
112
|
+
|
|
98
113
|
def _cmd_guard_dry_run(args: argparse.Namespace) -> int:
|
|
99
114
|
from agent_action_capsule import compute_capsule_id
|
|
100
115
|
|
|
101
116
|
from ..folds.loader import load_definition_file
|
|
102
117
|
from ..guards.capsule import local_only_refusal
|
|
103
118
|
from ..packs import PackDefinitionError, load_proposals_file
|
|
104
|
-
from ..report import build_dry_run_report, build_dry_run_report_with_proposal
|
|
105
|
-
from ..report.render import TelemetryConfig, decode_fragment, to_fragment_payload
|
|
119
|
+
from ..report import build_dry_run_report, build_dry_run_report_with_proposal
|
|
106
120
|
from ..telemetry.record import record_evidence_touch, record_guard_configured, record_guard_evaluated
|
|
107
121
|
|
|
108
122
|
if bool(args.model_note) != bool(args.model_id):
|
|
@@ -157,7 +171,7 @@ def _cmd_guard_dry_run(args: argparse.Namespace) -> int:
|
|
|
157
171
|
def _build():
|
|
158
172
|
if proposed_caps_minor is not None:
|
|
159
173
|
return build_dry_run_report_with_proposal(
|
|
160
|
-
args.
|
|
174
|
+
args.store,
|
|
161
175
|
caps_fold=caps_fold,
|
|
162
176
|
proposed_caps_minor=proposed_caps_minor,
|
|
163
177
|
since=since,
|
|
@@ -171,7 +185,7 @@ def _cmd_guard_dry_run(args: argparse.Namespace) -> int:
|
|
|
171
185
|
per_action_reads=per_action_reads,
|
|
172
186
|
)
|
|
173
187
|
return build_dry_run_report(
|
|
174
|
-
args.
|
|
188
|
+
args.store,
|
|
175
189
|
caps_fold=caps_fold,
|
|
176
190
|
since=since,
|
|
177
191
|
caps_minor=caps_minor,
|
|
@@ -183,7 +197,11 @@ def _cmd_guard_dry_run(args: argparse.Namespace) -> int:
|
|
|
183
197
|
per_action_reads=per_action_reads,
|
|
184
198
|
)
|
|
185
199
|
|
|
186
|
-
|
|
200
|
+
try:
|
|
201
|
+
report = _build()
|
|
202
|
+
except NotAStoreError as exc:
|
|
203
|
+
print(f"capsule guard dry-run: {exc}", file=sys.stderr)
|
|
204
|
+
return 2
|
|
187
205
|
|
|
188
206
|
# The printed link carries every row's decision capsule and the capsule
|
|
189
207
|
# it cites; one holding a local-only field must not leave this machine.
|
|
@@ -194,24 +212,13 @@ def _cmd_guard_dry_run(args: argparse.Namespace) -> int:
|
|
|
194
212
|
print(f"capsule guard dry-run --share: refused: {refusal}; rerun without --share", file=sys.stderr)
|
|
195
213
|
return 1
|
|
196
214
|
|
|
197
|
-
|
|
198
|
-
if args.telemetry_opt_in and args.telemetry_endpoint:
|
|
199
|
-
telemetry = TelemetryConfig(opted_in=True, endpoint=args.telemetry_endpoint)
|
|
200
|
-
|
|
201
|
-
html, fragment = render_report_html(report, arm=arm, telemetry=telemetry)
|
|
215
|
+
with_capsules = bool(args.share and evidence_visible)
|
|
202
216
|
out_path = Path(args.out)
|
|
203
|
-
out_path.write_text(
|
|
204
|
-
url = f"file://{out_path.resolve()}#{fragment}"
|
|
217
|
+
out_path.write_text(json.dumps(_report_payload(report, with_capsules=with_capsules), indent=2, sort_keys=True) + "\n", encoding="utf-8")
|
|
205
218
|
|
|
206
219
|
print(f"wrote {out_path}")
|
|
207
220
|
if report.manifest_digest is not None:
|
|
208
221
|
print(f"evaluated under manifest {report.manifest_digest}")
|
|
209
|
-
# Arm A ("guards-only"): the share link is a verify-link suggestion --
|
|
210
|
-
# not printed, matching the report itself never surfacing its evidence
|
|
211
|
-
# chrome. The file above still exists and is still openable; this CLI
|
|
212
|
-
# just doesn't advertise the fragment-carried permalink.
|
|
213
|
-
if args.share and evidence_visible:
|
|
214
|
-
print(url)
|
|
215
222
|
|
|
216
223
|
if caps_minor:
|
|
217
224
|
record_guard_configured(arm)
|
|
@@ -221,21 +228,21 @@ def _cmd_guard_dry_run(args: argparse.Namespace) -> int:
|
|
|
221
228
|
record_evidence_touch(arm)
|
|
222
229
|
|
|
223
230
|
if args.verify:
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
#
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
rhs = {k: v for k, v in
|
|
231
|
+
# --verify attests the file itself: it is read back and compared to a
|
|
232
|
+
# rebuild. generated_at is excluded: the one field that legitimately
|
|
233
|
+
# differs between two otherwise-identical replays (a wall-clock stamp).
|
|
234
|
+
written = json.loads(out_path.read_text(encoding="utf-8"))
|
|
235
|
+
lhs = {k: v for k, v in written.items() if k != "generated_at"}
|
|
236
|
+
rebuilt = _report_payload(_build(), with_capsules=with_capsules)
|
|
237
|
+
rhs = {k: v for k, v in rebuilt.items() if k != "generated_at"}
|
|
231
238
|
if lhs != rhs:
|
|
232
|
-
print("FAIL: replaying the same
|
|
239
|
+
print("FAIL: replaying the same records did not reproduce the report written", file=sys.stderr)
|
|
233
240
|
return 1
|
|
234
241
|
|
|
235
242
|
mismatches = []
|
|
236
|
-
for section in
|
|
243
|
+
for section in written["guards"]:
|
|
237
244
|
for row in section["rows"]:
|
|
238
|
-
for capsule in (row
|
|
245
|
+
for capsule in (row["capsule"], row["cited_capsule"]):
|
|
239
246
|
if not capsule:
|
|
240
247
|
continue
|
|
241
248
|
if compute_capsule_id(capsule) != capsule.get("capsule_id"):
|
|
@@ -245,7 +252,7 @@ def _cmd_guard_dry_run(args: argparse.Namespace) -> int:
|
|
|
245
252
|
noun = "cited capsule(s)" if evidence_visible else "cited record(s)"
|
|
246
253
|
print(f"FAIL: {len(mismatches)} {noun} do not re-verify", file=sys.stderr)
|
|
247
254
|
return 1
|
|
248
|
-
tail = " and every cited capsule verifies" if
|
|
255
|
+
tail = " and every cited capsule verifies" if with_capsules else ""
|
|
249
256
|
print(f"OK: report is reproducible{tail}")
|
|
250
257
|
|
|
251
258
|
return 0
|
|
@@ -273,30 +280,31 @@ def _cmd_guard_enforce(args: argparse.Namespace) -> int:
|
|
|
273
280
|
|
|
274
281
|
|
|
275
282
|
def add_parser(sub: argparse._SubParsersAction) -> argparse.ArgumentParser:
|
|
276
|
-
guard = sub.add_parser("guard", help="guard API: dry-run replay + report
|
|
283
|
+
guard = sub.add_parser("guard", help="guard API: dry-run replay + report")
|
|
277
284
|
guard_sub = guard.add_subparsers(dest="guard_command")
|
|
278
285
|
guard.set_defaults(guard_parser=guard)
|
|
279
286
|
|
|
280
287
|
p_dry_run = guard_sub.add_parser(
|
|
281
|
-
"dry-run", help="replay
|
|
288
|
+
"dry-run", help="replay stored records through the guard checks and write a JSON report"
|
|
282
289
|
)
|
|
283
290
|
p_dry_run.add_argument(
|
|
284
|
-
"--
|
|
291
|
+
"--store", required=True, action="append",
|
|
292
|
+
help="store directory, JSONL file of capsules or capsule bundle (repeatable)",
|
|
285
293
|
)
|
|
286
294
|
p_dry_run.add_argument(
|
|
287
295
|
"--since", default="7d",
|
|
288
|
-
help="rolling window, e.g. '7d' (anchored to the
|
|
296
|
+
help="rolling window, e.g. '7d' (anchored to the records' own latest); 'all' for no filter",
|
|
289
297
|
)
|
|
290
298
|
p_dry_run.add_argument(
|
|
291
299
|
"--share", action="store_true",
|
|
292
|
-
help="
|
|
300
|
+
help="include the sealed capsules in the report file (refused when one is local-only; no-op in the guards-only packaging arm)",
|
|
293
301
|
)
|
|
294
302
|
p_dry_run.add_argument(
|
|
295
303
|
"--verify", action="store_true", help="re-replay and re-verify every cited capsule before exiting"
|
|
296
304
|
)
|
|
297
|
-
p_dry_run.add_argument("--out", default="dry-run-report.
|
|
305
|
+
p_dry_run.add_argument("--out", default="dry-run-report.json", help="output JSON path (default: dry-run-report.json)")
|
|
298
306
|
p_dry_run.add_argument(
|
|
299
|
-
"--operator", default=None, help="override the displayed operator label (default: the
|
|
307
|
+
"--operator", default=None, help="override the displayed operator label (default: the records' own)"
|
|
300
308
|
)
|
|
301
309
|
p_dry_run.add_argument(
|
|
302
310
|
"--cap", action="append", default=[], metavar="CLASS=MINOR_UNITS",
|
|
@@ -341,16 +349,6 @@ def add_parser(sub: argparse._SubParsersAction) -> argparse.ArgumentParser:
|
|
|
341
349
|
"--no-manifest", dest="no_manifest", action="store_true",
|
|
342
350
|
help="skip policy-manifest resolution entirely (report carries no manifest_digest)",
|
|
343
351
|
)
|
|
344
|
-
p_dry_run.add_argument(
|
|
345
|
-
"--telemetry-opt-in", action="store_true",
|
|
346
|
-
help="embed a disclosed, anonymous open-beacon in the report for the M6 (viral unit) metric -- "
|
|
347
|
-
"requires --telemetry-endpoint too, and is off by default; see `capsule telemetry status`",
|
|
348
|
-
)
|
|
349
|
-
p_dry_run.add_argument(
|
|
350
|
-
"--telemetry-endpoint", default=env_get("CAPSULE_LEDGER_TELEMETRY_ENDPOINT"),
|
|
351
|
-
help="where the open-beacon above (if enabled) sends its single anonymous event (default: "
|
|
352
|
-
"$CAPSULE_LEDGER_TELEMETRY_ENDPOINT, or none -- with no endpoint the beacon is never embedded)",
|
|
353
|
-
)
|
|
354
352
|
p_dry_run.set_defaults(func=_cmd_guard_dry_run)
|
|
355
353
|
|
|
356
354
|
p_enforce = guard_sub.add_parser(
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
Materializes the pack's constraints and folds into ``<project-dir>/.capsule/``,
|
|
5
5
|
writes the policy manifest fragment that cites them plus the pack itself (by
|
|
6
6
|
digest, mode ``observe``) -- so which pack version is in force is provable --
|
|
7
|
-
and, when ``--
|
|
7
|
+
and, when ``--store`` is given, records that installation as a signed
|
|
8
8
|
``policy_manifest_activated`` event capsule (``packs/install.py``'s
|
|
9
9
|
``record_pack_activation``).
|
|
10
10
|
|
|
@@ -32,9 +32,8 @@ import secrets
|
|
|
32
32
|
import sys
|
|
33
33
|
from pathlib import Path
|
|
34
34
|
|
|
35
|
-
from cll.ledger import LedgerStore
|
|
36
|
-
|
|
37
35
|
from ..envcompat import env_get
|
|
36
|
+
from ..guards.history import NotAStoreError, open_store
|
|
38
37
|
from ..guards.signing import LocalSigner
|
|
39
38
|
from ..packs import (
|
|
40
39
|
PackDefinitionError,
|
|
@@ -107,9 +106,9 @@ def _cmd_init(args: argparse.Namespace) -> int:
|
|
|
107
106
|
f"{args.pack}` (not yet built)."
|
|
108
107
|
)
|
|
109
108
|
|
|
110
|
-
if not args.
|
|
109
|
+
if not args.store:
|
|
111
110
|
print()
|
|
112
|
-
print("no --
|
|
111
|
+
print("no --store given: manifest written to disk only, no activation capsule recorded")
|
|
113
112
|
return 0
|
|
114
113
|
|
|
115
114
|
key_id = args.key_id or env_get(_KEY_ID_ENV)
|
|
@@ -121,13 +120,15 @@ def _cmd_init(args: argparse.Namespace) -> int:
|
|
|
121
120
|
secret_text = secrets.token_hex(32)
|
|
122
121
|
signer = LocalSigner(key_id=key_id, secret=secret_text.encode("utf-8"))
|
|
123
122
|
|
|
124
|
-
ledger = LedgerStore(args.ledger)
|
|
125
123
|
try:
|
|
124
|
+
store = open_store(args.store, signer=signer, create=True)
|
|
125
|
+
except NotAStoreError as exc:
|
|
126
|
+
print(f"capsule init: {exc}", file=sys.stderr)
|
|
127
|
+
return 2
|
|
128
|
+
with store:
|
|
126
129
|
capsule = record_pack_activation(
|
|
127
|
-
installed,
|
|
130
|
+
installed, history=store, operator=args.operator, developer=args.developer, signer=signer
|
|
128
131
|
)
|
|
129
|
-
finally:
|
|
130
|
-
ledger.close()
|
|
131
132
|
|
|
132
133
|
print()
|
|
133
134
|
print(f"activation recorded: {capsule['capsule_id']}")
|
|
@@ -155,9 +156,9 @@ def add_parser(sub: argparse._SubParsersAction) -> argparse.ArgumentParser:
|
|
|
155
156
|
"this command still prints each artifact's digest so you can seed one)",
|
|
156
157
|
)
|
|
157
158
|
p_init.add_argument(
|
|
158
|
-
"--
|
|
159
|
-
help="
|
|
160
|
-
"is still written to disk)",
|
|
159
|
+
"--store", default=None,
|
|
160
|
+
help="store directory to record this install's activation capsule into, created if missing (default: "
|
|
161
|
+
"none, manifest is still written to disk)",
|
|
161
162
|
)
|
|
162
163
|
p_init.add_argument("--operator", default="local", help="operator identity for the activation capsule (default: 'local')")
|
|
163
164
|
p_init.add_argument(
|
|
@@ -4,14 +4,13 @@
|
|
|
4
4
|
funnel report), `init` (install a starter pack), `constraints` (list the
|
|
5
5
|
registered guard checks + action-class taxonomy), `tenant`
|
|
6
6
|
(engine-instance-per-tenant provisioning), plus the evidence verbs `verify`
|
|
7
|
-
(verify one ledger record or an offline bundle), `bundle` (produce a
|
|
8
|
-
self-contained verifiable slice of the ledger)
|
|
9
|
-
local console UI) -- registered only in the "full" packaging arm, same
|
|
7
|
+
(verify one ledger record or an offline bundle), and `bundle` (produce a
|
|
8
|
+
self-contained verifiable slice of the ledger) -- registered only in the "full" packaging arm, same
|
|
10
9
|
two-arm switch (`capsule_engine.packaging`) the original monorepo used.
|
|
11
10
|
|
|
12
11
|
This is a deliberately minimal dispatcher: the original monorepo's
|
|
13
12
|
`cli/main.py` wired every verb across ledger, folds, guards, packs, policy,
|
|
14
|
-
|
|
13
|
+
telemetry, etc. Post-split, this repo only owns the verb modules
|
|
15
14
|
that actually live here -- the rest stayed with their owning repo.
|
|
16
15
|
`cli/format.py` is not wired as a subcommand: it has no `add_parser`, it is
|
|
17
16
|
shared output-formatting helpers used by the verbs above.
|
|
@@ -27,7 +26,6 @@ import sys
|
|
|
27
26
|
from .. import packaging
|
|
28
27
|
from . import (
|
|
29
28
|
bundle_cmd,
|
|
30
|
-
console_cmd,
|
|
31
29
|
constraints_cmd,
|
|
32
30
|
guard_cmds,
|
|
33
31
|
init_cmds,
|
|
@@ -53,14 +51,13 @@ def _build_parser(arm: str | None = None) -> argparse.ArgumentParser:
|
|
|
53
51
|
telemetry_cmd.add_parser(sub)
|
|
54
52
|
packs_cmds.add_parser(sub)
|
|
55
53
|
|
|
56
|
-
# The record-query/evidence verbs -- capsule verify
|
|
57
|
-
# bundle
|
|
54
|
+
# The record-query/evidence verbs -- capsule verify and the shareable
|
|
55
|
+
# bundle -- are the "evidence": registered
|
|
58
56
|
# only in the "full" arm. See ``packaging.py``'s module docstring for
|
|
59
57
|
# why an env var, not a fork, drives this.
|
|
60
58
|
if packaging.evidence_visible(arm):
|
|
61
59
|
verify_cmd.add_parser(sub)
|
|
62
60
|
bundle_cmd.add_parser(sub)
|
|
63
|
-
console_cmd.add_parser(sub)
|
|
64
61
|
|
|
65
62
|
return parser
|
|
66
63
|
|
|
@@ -5,7 +5,7 @@ instance per tenant" pattern for a caller embedding this package for many
|
|
|
5
5
|
customers. See ``docs/tenant-provisioning.md`` for the layout and the
|
|
6
6
|
isolation rationale.
|
|
7
7
|
|
|
8
|
-
init -- provision a brand-new tenant: fresh
|
|
8
|
+
init -- provision a brand-new tenant: fresh store dir, this tenant's
|
|
9
9
|
own pinned manifest, first activation capsule. Refuses if the
|
|
10
10
|
tenant already has anything on disk.
|
|
11
11
|
upgrade -- re-materialize an existing tenant's manifest (e.g. after a
|
|
@@ -83,7 +83,7 @@ def _cmd_tenant_init(args: argparse.Namespace) -> int:
|
|
|
83
83
|
return 1
|
|
84
84
|
|
|
85
85
|
print(f"provisioned tenant {args.tenant_id!r} at {result.layout.root}")
|
|
86
|
-
print(f"
|
|
86
|
+
print(f" store: {result.layout.store_dir}")
|
|
87
87
|
print(f" manifest: {result.layout.manifest_path}")
|
|
88
88
|
print(f" manifest id: {result.manifest_id}")
|
|
89
89
|
print(f" manifest digest: {result.manifest_digest}")
|
|
@@ -169,7 +169,7 @@ def add_parser(sub: argparse._SubParsersAction) -> argparse.ArgumentParser:
|
|
|
169
169
|
tenant.set_defaults(tenant_parser=tenant)
|
|
170
170
|
|
|
171
171
|
p_init = tenant_sub.add_parser(
|
|
172
|
-
"init", help="provision a brand-new tenant instance (
|
|
172
|
+
"init", help="provision a brand-new tenant instance (store dir + manifest + first activation)"
|
|
173
173
|
)
|
|
174
174
|
p_init.add_argument("--tenants-root", required=True, help="directory holding one subdirectory per tenant")
|
|
175
175
|
p_init.add_argument("--tenant-id", required=True, help="this tenant's id (becomes a directory name -- lowercase, digits, hyphens)")
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
-
"""`capsule verify`: verify one
|
|
2
|
+
"""`capsule verify`: verify one stored record, or an entire bundle file offline.
|
|
3
3
|
|
|
4
4
|
Exit codes (CI-friendly, and distinguished because "not found" and "found
|
|
5
5
|
but tampered" are different failure modes a caller may want to branch on):
|
|
@@ -11,20 +11,22 @@ from __future__ import annotations
|
|
|
11
11
|
|
|
12
12
|
import argparse
|
|
13
13
|
import json
|
|
14
|
+
import os
|
|
14
15
|
import sys
|
|
15
16
|
|
|
16
17
|
from agent_action_capsule import verify as verify_capsule
|
|
17
|
-
from capsule_emit.ledger_io import open_ledger, require_ledger_path
|
|
18
18
|
|
|
19
|
+
from ..envcompat import env_get
|
|
20
|
+
from ..guards.history import History, MemoryHistory, NotAStoreError, open_store, verify_stored
|
|
19
21
|
from .format import build_echo
|
|
20
22
|
|
|
21
23
|
__all__ = ["add_parser", "run"]
|
|
22
24
|
|
|
23
25
|
|
|
24
26
|
def add_parser(sub: argparse._SubParsersAction) -> argparse.ArgumentParser:
|
|
25
|
-
p = sub.add_parser("verify", help="verify one
|
|
27
|
+
p = sub.add_parser("verify", help="verify one stored record, or an entire bundle file")
|
|
26
28
|
p.add_argument("capsule_id", nargs="?", help="a capsule_id or an unambiguous prefix (omit with --bundle)")
|
|
27
|
-
p.add_argument("--
|
|
29
|
+
p.add_argument("--store", help="store directory or a JSONL fixture file (default: $CAPSULE_STORE)")
|
|
28
30
|
p.add_argument(
|
|
29
31
|
"--bundle", help="verify every record in a bundle file produced by `capsule bundle`, offline and self-contained"
|
|
30
32
|
)
|
|
@@ -56,17 +58,26 @@ def run(args: argparse.Namespace) -> int:
|
|
|
56
58
|
print("capsule verify: capsule_id is required unless --bundle is given", file=sys.stderr)
|
|
57
59
|
return 2
|
|
58
60
|
|
|
59
|
-
|
|
60
|
-
if
|
|
61
|
+
store_path = args.store or env_get("CAPSULE_STORE")
|
|
62
|
+
if store_path is None:
|
|
63
|
+
print("capsule verify: --store is required (or set $CAPSULE_STORE)", file=sys.stderr)
|
|
61
64
|
return 2
|
|
62
65
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
66
|
+
try:
|
|
67
|
+
history = _open(store_path)
|
|
68
|
+
except NotAStoreError as exc:
|
|
69
|
+
print(f"capsule verify: {exc}", file=sys.stderr)
|
|
70
|
+
return 2
|
|
71
|
+
try:
|
|
72
|
+
verified = verify_stored(history, args.capsule_id)
|
|
73
|
+
if verified is None:
|
|
74
|
+
print(f"no such capsule {args.capsule_id!r} in store {store_path}", file=sys.stderr)
|
|
67
75
|
return 2
|
|
68
|
-
result =
|
|
69
|
-
|
|
76
|
+
capsule_id, result = verified
|
|
77
|
+
finally:
|
|
78
|
+
close = getattr(history, "close", None)
|
|
79
|
+
if close is not None:
|
|
80
|
+
close()
|
|
70
81
|
|
|
71
82
|
if args.json:
|
|
72
83
|
print(
|
|
@@ -88,6 +99,14 @@ def run(args: argparse.Namespace) -> int:
|
|
|
88
99
|
return 0 if ok else 1
|
|
89
100
|
|
|
90
101
|
|
|
102
|
+
def _open(path: str) -> History:
|
|
103
|
+
"""A store directory, or a JSONL fixture file of capsules read in order."""
|
|
104
|
+
if os.path.isdir(path):
|
|
105
|
+
return open_store(path)
|
|
106
|
+
with open(path, encoding="utf-8") as fh:
|
|
107
|
+
return MemoryHistory(json.loads(line) for line in fh if line.strip())
|
|
108
|
+
|
|
109
|
+
|
|
91
110
|
def _run_bundle(args: argparse.Namespace) -> int:
|
|
92
111
|
try:
|
|
93
112
|
with open(args.bundle, encoding="utf-8") as fh:
|
|
@@ -27,7 +27,7 @@ Public surface:
|
|
|
27
27
|
capsule(s) it gave rise to (e.g. a caller's own tool-call capsules),
|
|
28
28
|
resolved back via ``find_turn_reference``.
|
|
29
29
|
- ``find_session_turns`` / ``find_session_close`` / ``find_turn_reference``
|
|
30
|
-
-- read a session (or a cross-reference) back off any ``
|
|
30
|
+
-- read a session (or a cross-reference) back off any ``History``.
|
|
31
31
|
- ``session_root`` / ``turn_inclusion_proof`` / ``verify_turn_inclusion`` --
|
|
32
32
|
the Merkle session-digest primitives (``.merkle``).
|
|
33
33
|
- ``ConversationSession`` -- the stateful recorder: seals and appends each
|