capsule-engine 0.1.0__tar.gz → 0.2.0__tar.gz

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