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.
Files changed (468) hide show
  1. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/PKG-INFO +6 -6
  2. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/README.md +2 -2
  3. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/__init__.py +3 -3
  4. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/cli/bundle_cmd.py +2 -39
  5. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/cli/format.py +2 -2
  6. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/cli/guard_cmds.py +50 -52
  7. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/cli/init_cmds.py +13 -12
  8. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/cli/main.py +5 -8
  9. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/cli/tenant_cmds.py +3 -3
  10. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/cli/verify_cmd.py +31 -12
  11. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/conversation/__init__.py +1 -1
  12. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/conversation/capsules.py +16 -11
  13. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/conversation/session.py +7 -9
  14. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/examples/tau2_airline_reference.py +37 -49
  15. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/__init__.py +1 -1
  16. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/action.py +9 -1
  17. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/capsule.py +2 -0
  18. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/__init__.py +35 -28
  19. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/caps.py +13 -15
  20. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/counterparty_identity_change.py +7 -8
  21. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/counterparty_seen_before.py +7 -9
  22. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/dedupe.py +5 -6
  23. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/plan_containment.py +2 -2
  24. capsule_engine-0.3.0/capsule_engine/guards/checks/rate_cap.py +92 -0
  25. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/release_on_acceptance.py +8 -9
  26. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/required_disclosure.py +12 -15
  27. capsule_engine-0.3.0/capsule_engine/guards/checks/required_fields.py +77 -0
  28. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/single_commitment.py +7 -9
  29. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/verify_before_dispatch.py +6 -7
  30. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/engine.py +27 -16
  31. capsule_engine-0.3.0/capsule_engine/guards/history.py +539 -0
  32. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/revocation.py +6 -6
  33. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/tool_call.py +4 -6
  34. capsule_engine-0.3.0/capsule_engine/guards/wickets/catalog_defs/rate_cap.yaml +21 -0
  35. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/definition.py +2 -1
  36. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/holds/engine.py +22 -23
  37. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/holds/scope.py +2 -2
  38. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/mcp/config.py +27 -28
  39. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/mcp/server.py +4 -4
  40. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/mcp/tools.py +54 -36
  41. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/everyday/AI-BOOTSTRAP.md +3 -3
  42. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/everyday/fixtures/mini_ledger.jsonl +45 -45
  43. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/everyday/pack.yaml +20 -6
  44. capsule_engine-0.3.0/capsule_engine/packs/catalog/inference/pack.yaml +86 -0
  45. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/seller/fixtures/mini_ledger.jsonl +83 -83
  46. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/seller/pack.yaml +9 -2
  47. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/install.py +19 -10
  48. capsule_engine-0.3.0/capsule_engine/packs/obligation_results.py +141 -0
  49. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/schema.py +9 -4
  50. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/policy/activation.py +6 -8
  51. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/policy/limits.py +7 -8
  52. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/policy/profile.py +34 -3
  53. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/policy/resolve.py +26 -9
  54. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/registry/conventions.json +1 -1
  55. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/registry/conventions.py +1 -1
  56. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/registry/cpb_registry.json +3 -3
  57. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/report/__init__.py +6 -8
  58. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/report/build.py +2 -2
  59. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/report/live_check.py +28 -16
  60. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/report/live_history.py +15 -17
  61. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/report/model.py +58 -2
  62. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/report/replay.py +187 -93
  63. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/report/sale_bundle.py +2 -2
  64. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/telemetry/events.py +3 -3
  65. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/tenants.py +20 -16
  66. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine.egg-info/PKG-INFO +6 -6
  67. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine.egg-info/SOURCES.txt +9 -21
  68. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine.egg-info/requires.txt +2 -2
  69. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/pyproject.toml +10 -15
  70. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_action_class_gate.py +1 -1
  71. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_ask_declared_wickets.py +7 -7
  72. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_caps_authorised_maximum.py +4 -4
  73. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_caps_money_classes.py +1 -1
  74. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_caps_per_action_limit.py +4 -4
  75. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_cli_format_coverage.py +1 -1
  76. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_cli_verify.py +4 -4
  77. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_conformance_vectors.py +11 -1
  78. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_conversation_capsules.py +10 -10
  79. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_counterparty_list.py +5 -5
  80. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_counterparty_seen_before_dry_run.py +4 -4
  81. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_counterparty_seen_before_no_payee.py +4 -4
  82. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_deal_bundle_reader.py +10 -12
  83. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_deal_id_from_chain_id.py +3 -3
  84. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_dedupe_deal_act.py +5 -5
  85. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_dedupe_equivalence_key.py +3 -3
  86. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_dedupe_non_act_records.py +2 -2
  87. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_executed_acts_window.py +4 -4
  88. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_fold_retention_continuity.py +1 -1
  89. capsule_engine-0.3.0/tests/test_gate_reasons_182.py +133 -0
  90. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_gate_rules_declared_ask.py +6 -6
  91. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_generate_go_packs.py +29 -0
  92. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_guard_configured_checks.py +7 -7
  93. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_guard_counterparty_seen_before.py +1 -1
  94. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_guard_dry_run.py +2 -2
  95. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_guard_escalate_disposition.py +1 -1
  96. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_guard_eur150k_bridge.py +7 -5
  97. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_guard_failure_semantics.py +22 -29
  98. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_guard_manifest_digest.py +5 -5
  99. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_guard_na_evidence.py +2 -2
  100. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_guard_plan_containment.py +2 -2
  101. capsule_engine-0.3.0/tests/test_history.py +376 -0
  102. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_history_act_counterparty.py +4 -4
  103. capsule_engine-0.3.0/tests/test_history_reversal.py +136 -0
  104. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_hold_a_ruling.py +6 -6
  105. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_holds_expiry.py +18 -18
  106. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_holds_reconcile.py +8 -7
  107. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_holds_reserve.py +14 -14
  108. capsule_engine-0.3.0/tests/test_inference_pack.py +183 -0
  109. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_listing_classes.py +4 -4
  110. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_live_history.py +5 -5
  111. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_live_history_untyped_acts.py +4 -4
  112. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_local_only_payload_fields.py +8 -13
  113. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_manifest_activation.py +4 -4
  114. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_mcp_session.py +1 -1
  115. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_mcp_tools.py +5 -4
  116. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_no_capsule_ledger_imports.py +15 -8
  117. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_operator_limits.py +7 -7
  118. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_differential_concurrency.py +10 -8
  119. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_everyday_acceptance.py +8 -8
  120. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_everyday_account_holder_asks.py +5 -5
  121. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_everyday_gold_labels.py +3 -3
  122. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_everyday_rule_selectors.py +6 -6
  123. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_everyday_rules_27.py +3 -2
  124. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_everyday_sale_coverage.py +3 -3
  125. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_payments_safety_acceptance.py +12 -14
  126. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_payments_safety_p2_lifecycle.py +7 -9
  127. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_seller.py +6 -6
  128. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_seller_acceptance.py +10 -10
  129. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_seller_gold_labels.py +3 -3
  130. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_without_caps.py +5 -5
  131. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_payee_fp_profile.py +6 -7
  132. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_platform_recipient_role.py +7 -7
  133. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_policy_profile.py +11 -11
  134. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_price_floor_committed_bounds.py +3 -3
  135. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_real_seller_bundle.py +4 -4
  136. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_real_two_deal_bundle.py +4 -4
  137. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_record_taxonomy_gate.py +5 -5
  138. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_refund_never_blocks_spend_window.py +1 -1
  139. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_registry_conventions.py +1 -1
  140. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_release_on_acceptance.py +15 -11
  141. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_release_on_acceptance_history.py +10 -10
  142. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_repeat_disclosures.py +4 -4
  143. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_report_dry_run.py +44 -114
  144. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_report_manifest.py +4 -4
  145. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_report_result_from_folds.py +1 -1
  146. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_representing_bridge.py +5 -5
  147. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_ruleset_diff.py +3 -3
  148. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_sale_replay.py +7 -7
  149. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_sale_standalone_report.py +1 -1
  150. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_scalar_input_checks.py +1 -1
  151. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_seller_destination_rail_v1_1.py +3 -3
  152. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_seller_statements.py +5 -5
  153. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_seller_wickets.py +4 -4
  154. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_single_commitment.py +1 -1
  155. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_spend_weekly_reversals.py +2 -2
  156. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_tau2_airline_reference.py +9 -17
  157. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_telemetry.py +4 -4
  158. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_tenant_provisioning.py +10 -10
  159. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_wicket_definition.py +2 -1
  160. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_window_held.py +3 -3
  161. capsule_engine-0.2.0/capsule_engine/bundle_viewer/__init__.py +0 -21
  162. capsule_engine-0.2.0/capsule_engine/bundle_viewer/static/offline_shell.html +0 -1509
  163. capsule_engine-0.2.0/capsule_engine/bundle_viewer/viewer.py +0 -57
  164. capsule_engine-0.2.0/capsule_engine/cli/console_cmd.py +0 -70
  165. capsule_engine-0.2.0/capsule_engine/console/__init__.py +0 -10
  166. capsule_engine-0.2.0/capsule_engine/console/api.py +0 -251
  167. capsule_engine-0.2.0/capsule_engine/console/components.css +0 -406
  168. capsule_engine-0.2.0/capsule_engine/console/console.css +0 -130
  169. capsule_engine-0.2.0/capsule_engine/console/console.html +0 -51
  170. capsule_engine-0.2.0/capsule_engine/console/console.js +0 -330
  171. capsule_engine-0.2.0/capsule_engine/console/gallery.html +0 -274
  172. capsule_engine-0.2.0/capsule_engine/console/server.py +0 -137
  173. capsule_engine-0.2.0/capsule_engine/console/tokens.css +0 -68
  174. capsule_engine-0.2.0/capsule_engine/packs/obligation_results.py +0 -72
  175. capsule_engine-0.2.0/capsule_engine/report/render.py +0 -467
  176. capsule_engine-0.2.0/capsule_engine/report/static/verify.js +0 -451
  177. capsule_engine-0.2.0/tests/test_cli_bundle_with_viewer.py +0 -192
  178. capsule_engine-0.2.0/tests/test_cli_console.py +0 -199
  179. capsule_engine-0.2.0/tests/test_console_product_laws.py +0 -218
  180. capsule_engine-0.2.0/tests/test_console_server_product_laws.py +0 -121
  181. capsule_engine-0.2.0/tests/test_console_withheld_payloads.py +0 -89
  182. capsule_engine-0.2.0/tests/test_report_two_arm_rendering.py +0 -47
  183. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/LICENSE +0 -0
  184. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/cli/__init__.py +0 -0
  185. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/cli/constraints_cmd.py +0 -0
  186. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/cli/engine_plugin.py +0 -0
  187. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/cli/packs_cmds.py +0 -0
  188. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/cli/telemetry_cmd.py +0 -0
  189. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/compiler/__init__.py +0 -0
  190. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/compiler/effect_model.py +0 -0
  191. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/compiler/vocabulary.py +0 -0
  192. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/conversation/exchange.py +0 -0
  193. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/conversation/merkle.py +0 -0
  194. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/envcompat.py +0 -0
  195. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/events/__init__.py +0 -0
  196. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/events/capsule.py +0 -0
  197. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/examples/__init__.py +0 -0
  198. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/examples/data/tau2_airline/LICENSE-tau2-bench +0 -0
  199. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/examples/data/tau2_airline/PROVENANCE.json +0 -0
  200. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/examples/data/tau2_airline/hand_labels.json +0 -0
  201. {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
  202. {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
  203. {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
  204. {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
  205. {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
  206. {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
  207. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/examples/tau2_conversation_exchange.py +0 -0
  208. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/__init__.py +0 -0
  209. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/account_core.py +0 -0
  210. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/approval_latency.py +0 -0
  211. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/catalog.py +0 -0
  212. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/catalog_defs/actions.count_by_developer.yaml +0 -0
  213. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/catalog_defs/actions.executed_count.yaml +0 -0
  214. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/catalog_defs/actions.last_decision.yaml +0 -0
  215. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/catalog_defs/counterparty.seen_before.v2.yaml +0 -0
  216. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/catalog_defs/counterparty.seen_before.v3.yaml +0 -0
  217. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/catalog_defs/counterparty.seen_before.yaml +0 -0
  218. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/catalog_defs/disclosure.class_seen.yaml +0 -0
  219. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/catalog_defs/disclosure.statement_seen.yaml +0 -0
  220. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/catalog_defs/hold.active_exposure.yaml +0 -0
  221. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/catalog_defs/spend.weekly.v2.yaml +0 -0
  222. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/catalog_defs/spend.weekly.v3.1.yaml +0 -0
  223. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/catalog_defs/spend.weekly.v3.yaml +0 -0
  224. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/catalog_defs/spend.weekly.yaml +0 -0
  225. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/counterparty_signals.py +0 -0
  226. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/definition.py +0 -0
  227. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/duration.py +0 -0
  228. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/engine.py +0 -0
  229. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/errors.py +0 -0
  230. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/loader.py +0 -0
  231. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/ordering.py +0 -0
  232. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/paths.py +0 -0
  233. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/record_type_coverage.py +0 -0
  234. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/reducers.py +0 -0
  235. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/retention_continuity.py +0 -0
  236. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/set_membership.py +0 -0
  237. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/folds/taxonomy.py +0 -0
  238. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/action_taxonomy.json +0 -0
  239. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/action_taxonomy_v2.json +0 -0
  240. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/action_taxonomy_v3.json +0 -0
  241. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/action_taxonomy_v4.json +0 -0
  242. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/action_taxonomy_v5.json +0 -0
  243. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/action_class_gate.py +0 -0
  244. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/base.py +0 -0
  245. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/channel_change.py +0 -0
  246. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/commitment.py +0 -0
  247. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/counterparty_list.py +0 -0
  248. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/credential_pattern.py +0 -0
  249. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/destination_rail.py +0 -0
  250. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/field_change_count.py +0 -0
  251. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/offer_expiry.py +0 -0
  252. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/price_floor.py +0 -0
  253. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/promise_never.py +0 -0
  254. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/promise_requires_approval.py +0 -0
  255. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/recipient_role.py +0 -0
  256. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/recurring_charge.py +0 -0
  257. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/refundability.py +0 -0
  258. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/task_authority.py +0 -0
  259. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/checks/upfront_amount.py +0 -0
  260. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/classes.py +0 -0
  261. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/history_state.py +0 -0
  262. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/plan.py +0 -0
  263. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/signing.py +0 -0
  264. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/statements.py +0 -0
  265. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/__init__.py +0 -0
  266. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog.py +0 -0
  267. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/action_class_gate.v1.1.yaml +0 -0
  268. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/action_class_gate.v1.2.yaml +0 -0
  269. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/action_class_gate.yaml +0 -0
  270. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/caps.v2.yaml +0 -0
  271. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/caps.v3.yaml +0 -0
  272. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/caps.v4.yaml +0 -0
  273. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/caps.v5.1.yaml +0 -0
  274. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/caps.v5.yaml +0 -0
  275. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/caps.yaml +0 -0
  276. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/caps_holds.yaml +0 -0
  277. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/channel_change.v1.1.yaml +0 -0
  278. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/channel_change.yaml +0 -0
  279. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/counterparty_identity_change.yaml +0 -0
  280. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/counterparty_list.yaml +0 -0
  281. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/counterparty_seen_before.v2.yaml +0 -0
  282. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/counterparty_seen_before.v3.yaml +0 -0
  283. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/counterparty_seen_before.v4.yaml +0 -0
  284. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/counterparty_seen_before.yaml +0 -0
  285. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/credential_pattern.yaml +0 -0
  286. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/dedupe.yaml +0 -0
  287. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/destination_rail.seller.v1.1.yaml +0 -0
  288. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/destination_rail.seller.yaml +0 -0
  289. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/destination_rail.yaml +0 -0
  290. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/hold_reconcile.yaml +0 -0
  291. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/material_fields_changed.v1.1.yaml +0 -0
  292. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/material_fields_changed.yaml +0 -0
  293. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/offer_expiry.v1.1.yaml +0 -0
  294. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/offer_expiry.yaml +0 -0
  295. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/offer_fields_changed.v1.1.yaml +0 -0
  296. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/offer_fields_changed.yaml +0 -0
  297. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/price_floor.yaml +0 -0
  298. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/promise_never.v1.1.yaml +0 -0
  299. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/promise_never.yaml +0 -0
  300. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/promise_requires_approval.v1.1.yaml +0 -0
  301. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/promise_requires_approval.yaml +0 -0
  302. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/recipient_role.seller.v1.1.yaml +0 -0
  303. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/recipient_role.seller.v1.2.yaml +0 -0
  304. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/recipient_role.seller.yaml +0 -0
  305. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/recipient_role.v1.1.yaml +0 -0
  306. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/recipient_role.yaml +0 -0
  307. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/recipient_seen_before.yaml +0 -0
  308. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/recurring_charge.yaml +0 -0
  309. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/refundability.v1.1.yaml +0 -0
  310. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/refundability.yaml +0 -0
  311. {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
  312. {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
  313. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/release_on_acceptance.seller.yaml +0 -0
  314. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/required_disclosure.v1.1.yaml +0 -0
  315. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/required_disclosure.v1.2.yaml +0 -0
  316. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/required_disclosure.yaml +0 -0
  317. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/single_commitment.seller.yaml +0 -0
  318. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/task_authority.v1.1.yaml +0 -0
  319. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/task_authority.yaml +0 -0
  320. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/upfront_amount.v1.1.yaml +0 -0
  321. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/upfront_amount.yaml +0 -0
  322. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/catalog_defs/verify_before_dispatch.yaml +0 -0
  323. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/errors.py +0 -0
  324. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/loader.py +0 -0
  325. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/guards/wickets/retired.py +0 -0
  326. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/holds/__init__.py +0 -0
  327. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/holds/capsules.py +0 -0
  328. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/holds/errors.py +0 -0
  329. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/holds/policy.py +0 -0
  330. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/mcp/__init__.py +0 -0
  331. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packaging.py +0 -0
  332. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/__init__.py +0 -0
  333. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/backfill_coverage.py +0 -0
  334. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/airline-engagement/AI-BOOTSTRAP.md +0 -0
  335. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/airline-engagement/folds/session_close.yaml +0 -0
  336. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/airline-engagement/pack.yaml +0 -0
  337. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/eu-ai-act/fixtures/trace/good_execution.json +0 -0
  338. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/eu-ai-act/fixtures/trace/oversight_declared.json +0 -0
  339. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/eu-ai-act/fixtures/trace/tampered_execution.json +0 -0
  340. {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
  341. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/eu-ai-act/obligations-pack-note.md +0 -0
  342. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/eu-ai-act/obligations-register.yaml +0 -0
  343. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/eu-ai-act/pack.yaml +0 -0
  344. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/eu-ai-act/register.yaml +0 -0
  345. {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
  346. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/eu-ai-act-deterministic/pack.yaml +0 -0
  347. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/payments-safety/AI-BOOTSTRAP.md +0 -0
  348. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/payments-safety/fixtures/mini_ledger.jsonl +0 -0
  349. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/payments-safety/folds/spend_weekly.yaml +0 -0
  350. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/payments-safety/pack.yaml +0 -0
  351. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/standard-vendor/AI-BOOTSTRAP.md +0 -0
  352. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/standard-vendor/folds/session_close.yaml +0 -0
  353. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/catalog/standard-vendor/pack.yaml +0 -0
  354. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/contract_diff.py +0 -0
  355. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/contract_validate.py +0 -0
  356. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/corpus_verify.py +0 -0
  357. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/enforce.py +0 -0
  358. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/errors.py +0 -0
  359. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/eu_ai_act_trace_field_map.py +0 -0
  360. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/loader.py +0 -0
  361. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/measurability_report.py +0 -0
  362. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/pins.py +0 -0
  363. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/thresholds.py +0 -0
  364. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/trace_attainment.py +0 -0
  365. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/packs/trace_reader.py +0 -0
  366. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/policy/__init__.py +0 -0
  367. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/policy/catalog_defs/default.yaml +0 -0
  368. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/policy/catalog_defs/holds.yaml +0 -0
  369. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/policy/errors.py +0 -0
  370. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/policy/loader.py +0 -0
  371. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/policy/manifest.py +0 -0
  372. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/register/__init__.py +0 -0
  373. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/register/compiler.py +0 -0
  374. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/register/errors.py +0 -0
  375. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/register/loader.py +0 -0
  376. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/register/schema.py +0 -0
  377. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/registry/__init__.py +0 -0
  378. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/report/coverage.py +0 -0
  379. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/report/errors.py +0 -0
  380. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/report/result.py +0 -0
  381. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/report/result_from_folds.py +0 -0
  382. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/report/result_from_layers.py +0 -0
  383. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/rulesets/__init__.py +0 -0
  384. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/rulesets/check.py +0 -0
  385. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/schemas/engine-ruleset-v0.json +0 -0
  386. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/schemas/evidence-contract-v0.json +0 -0
  387. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/schemas/vendor/epistemic-types.json +0 -0
  388. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/schemas/vendor/evidence-result-v0.json +0 -0
  389. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/schemas/vendor/external-check-input-v0.json +0 -0
  390. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/schemas/vendor/external-check-result-v0.json +0 -0
  391. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/telemetry/__init__.py +0 -0
  392. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/telemetry/consent.py +0 -0
  393. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/telemetry/fixtures/synthetic_events.jsonl +0 -0
  394. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/telemetry/funnel.py +0 -0
  395. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/telemetry/record.py +0 -0
  396. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/telemetry/sink.py +0 -0
  397. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine/telemetry/state.py +0 -0
  398. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine.egg-info/dependency_links.txt +0 -0
  399. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine.egg-info/entry_points.txt +0 -0
  400. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/capsule_engine.egg-info/top_level.txt +0 -0
  401. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/setup.cfg +0 -0
  402. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_account_core_defork.py +0 -0
  403. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_action_taxonomy_table.py +0 -0
  404. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_caps_shipped_defaults.py +0 -0
  405. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_cli_bundle.py +0 -0
  406. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_cli_bundle_period.py +0 -0
  407. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_compiler_effect_model.py +0 -0
  408. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_compiler_vocabulary.py +0 -0
  409. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_contract_cases.py +0 -0
  410. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_counterparty_seen_before_carried_out.py +0 -0
  411. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_deal_bridge_scalar_fields.py +0 -0
  412. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_dedupe_cross_deal_repeat.py +0 -0
  413. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_dedupe_refund_key.py +0 -0
  414. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_engine_plugin.py +0 -0
  415. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_evidence_contract_schema.py +0 -0
  416. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_fold_approval_latency.py +0 -0
  417. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_fold_definition.py +0 -0
  418. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_fold_engine.py +0 -0
  419. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_fold_identity.py +0 -0
  420. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_fold_ordering.py +0 -0
  421. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_fold_record_type_coverage.py +0 -0
  422. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_fold_set_membership.py +0 -0
  423. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_fold_taxonomy.py +0 -0
  424. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_fold_vectors.py +0 -0
  425. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_folds_never_call_judge_harness.py +0 -0
  426. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_folds_package_namespace_exports.py +0 -0
  427. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_holds_capsules.py +0 -0
  428. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_import_order.py +0 -0
  429. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_mcp_backend_seam.py +0 -0
  430. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_mcp_schema.py +0 -0
  431. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_offer_expiry_no_proposal.py +0 -0
  432. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_backfill_coverage.py +0 -0
  433. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_catalog_refs.py +0 -0
  434. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_decision_table.py +0 -0
  435. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_default_disposition.py +0 -0
  436. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_eu_ai_act_deterministic.py +0 -0
  437. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_eu_ai_act_trace.py +0 -0
  438. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_everyday_wording.py +0 -0
  439. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_loader.py +0 -0
  440. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_obligation_judge_pin.py +0 -0
  441. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_obligation_measurability.py +0 -0
  442. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_outcomes_both_shapes_and_retail.py +0 -0
  443. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_outcomes_schema.py +0 -0
  444. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_pins.py +0 -0
  445. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_scope_validator.py +0 -0
  446. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_taxonomy_pin.py +0 -0
  447. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pack_topology_profiles.py +0 -0
  448. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_pickup_area.py +0 -0
  449. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_plan_containment_check.py +0 -0
  450. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_plan_definition.py +0 -0
  451. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_policy_manifest.py +0 -0
  452. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_register_compiler.py +0 -0
  453. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_register_loader.py +0 -0
  454. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_register_obligations.py +0 -0
  455. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_registry_grc_facets.py +0 -0
  456. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_report_coverage.py +0 -0
  457. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_report_coverage_fixture.py +0 -0
  458. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_report_guard_projection.py +0 -0
  459. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_report_proposed_caps_section.py +0 -0
  460. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_report_result.py +0 -0
  461. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_report_result_extension_slot.py +0 -0
  462. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_report_result_from_layers.py +0 -0
  463. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_report_result_unknown_fixtures.py +0 -0
  464. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_report_word_discipline.py +0 -0
  465. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_spend_weekly_executed_acts.py +0 -0
  466. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_tau2_airline_reference_coverage.py +0 -0
  467. {capsule_engine-0.2.0 → capsule_engine-0.3.0}/tests/test_tau2_conversation_exchange.py +0 -0
  468. {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.2.0
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.
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>=0.6.0
17
+ Requires-Dist: checkpointed-local-log<0.9,>=0.8.0
18
18
  Requires-Dist: jsonschema>=4.18
19
- Requires-Dist: capsule-emit>=0.12.0
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 local
36
- console/report/bundle-viewer runtime.
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 local
5
- console/report/bundle-viewer runtime.
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 local console/report/bundle-viewer
4
- surfaces for AI agent actions. Ledger storage comes from
5
- checkpointed-local-log (``cll.ledger``); the action-class registry is this
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 and offline viewer -- it must show where the file went
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(ScanQuery()))
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 and the
115
- offline viewer -- a public page -- so it must never carry an operator's
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 + self-contained HTML report (moved
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
- (``capsule_ledger.packaging``) and, in "guards-only", both suppresses the
10
- evidence chrome in the rendered HTML report (``render_report_html``'s own
11
- ``arm`` param) and rewords/suppresses this command's own stdout so it never
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, render_report_html
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.ledger,
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.ledger,
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
- report = _build()
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
- telemetry = None
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(html, encoding="utf-8")
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
- written_payload = decode_fragment(fragment)
225
- rebuilt_payload = to_fragment_payload(_build())
226
- # exclude generated_at: the one field that legitimately differs
227
- # between two otherwise-identical replays (it's a wall-clock
228
- # generation timestamp, not derived from the ledger).
229
- lhs = {k: v for k, v in written_payload.items() if k != "generated_at"}
230
- rhs = {k: v for k, v in rebuilt_payload.items() if k != "generated_at"}
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 ledger did not reproduce the same report", file=sys.stderr)
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 written_payload["guards"]:
243
+ for section in written["guards"]:
237
244
  for row in section["rows"]:
238
- for capsule in (row.get("capsule"), row.get("cited_capsule")):
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 evidence_visible else ""
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 (full CLI lands in a later task)")
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 a ledger through the guard checks and emit a self-contained HTML report"
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
- "--ledger", required=True, action="append", help="ledger JSONL file or LedgerStore directory (repeatable)"
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 ledger's own latest record); 'all' for no filter",
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="print the full shareable file://...#<fragment> URL (no-op in the guards-only packaging arm)",
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.html", help="output HTML path (default: dry-run-report.html)")
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 ledger's own)"
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 ``--ledger`` is given, records that installation as a signed
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.ledger:
109
+ if not args.store:
111
110
  print()
112
- print("no --ledger given: manifest written to disk only, no activation capsule recorded")
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, ledger=ledger, operator=args.operator, developer=args.developer, signer=signer
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
- "--ledger", default=None,
159
- help="ledger store directory to record this install's activation capsule into (default: none, manifest "
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), and `console` (serve the
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
- console, telemetry, etc. Post-split, this repo only owns the verb modules
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, the shareable
57
- # bundle, and the local console UI -- are the "evidence": registered
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 ledger dir, this tenant's
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" ledger: {result.layout.ledger_dir}")
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 (ledger dir + manifest + first activation)"
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 ledger record, or an entire bundle file offline.
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 ledger record, or an entire bundle file")
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("--ledger", help="ledger store directory or a JSONL fixture file (default: $CAPSULE_LEDGER)")
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
- ledger_path = require_ledger_path("verify", args)
60
- if ledger_path is None:
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
- with open_ledger(ledger_path) as store:
64
- record = store.fetch(args.capsule_id)
65
- if record is None:
66
- print(f"no such capsule {args.capsule_id!r} in ledger {ledger_path}", file=sys.stderr)
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 = store.verify(record.capsule_id)
69
- capsule_id = record.capsule_id
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 ``LedgerAPI``.
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