controlzero 1.13.1__tar.gz → 1.13.3__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 (299) hide show
  1. {controlzero-1.13.1 → controlzero-1.13.3}/CHANGELOG.md +38 -0
  2. {controlzero-1.13.1 → controlzero-1.13.3}/PKG-INFO +1 -1
  3. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/__init__.py +1 -1
  4. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/doctor.py +83 -0
  5. controlzero-1.13.3/controlzero/cli/enforcement.py +861 -0
  6. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/hosts/antigravity.py +1 -0
  7. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/hosts/base.py +10 -0
  8. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/hosts/claude_code.py +1 -0
  9. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/hosts/codex_cli.py +1 -0
  10. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/hosts/cursor.py +1 -0
  11. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/hosts/cursor_cli.py +1 -0
  12. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/hosts/gemini_cli.py +1 -0
  13. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/hosts/kiro.py +2 -0
  14. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/main.py +272 -110
  15. {controlzero-1.13.1 → controlzero-1.13.3}/pyproject.toml +1 -1
  16. controlzero-1.13.3/tests/fixtures/adapter-contracts/antigravity.json +21 -0
  17. controlzero-1.13.3/tests/fixtures/adapter-contracts/claude_code.json +31 -0
  18. controlzero-1.13.3/tests/fixtures/adapter-contracts/codex_cli.json +24 -0
  19. controlzero-1.13.3/tests/fixtures/adapter-contracts/cursor.json +31 -0
  20. controlzero-1.13.3/tests/fixtures/adapter-contracts/gemini_cli.json +25 -0
  21. controlzero-1.13.3/tests/fixtures/adapter-contracts/kiro.json +37 -0
  22. controlzero-1.13.3/tests/test_adapter_contracts.py +216 -0
  23. controlzero-1.13.3/tests/test_kiro_cli_v210_hooks.py +110 -0
  24. {controlzero-1.13.1 → controlzero-1.13.3}/.gitignore +0 -0
  25. {controlzero-1.13.1 → controlzero-1.13.3}/Dockerfile.test +0 -0
  26. {controlzero-1.13.1 → controlzero-1.13.3}/LICENSE +0 -0
  27. {controlzero-1.13.1 → controlzero-1.13.3}/README.md +0 -0
  28. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/__main__.py +0 -0
  29. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/__init__.py +0 -0
  30. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/_messages.py +0 -0
  31. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/action_aliases.py +0 -0
  32. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/action_validator.py +0 -0
  33. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/bundle.py +0 -0
  34. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/condition_ops.py +0 -0
  35. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/credential_hook.py +0 -0
  36. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/credential_scanner.py +0 -0
  37. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/credentials_data/__init__.py +0 -0
  38. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/credentials_data/built_in.yaml +0 -0
  39. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/dlp_scanner.py +0 -0
  40. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/enforcer.py +0 -0
  41. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/hook_extractors.py +0 -0
  42. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/io_capture_producer.py +0 -0
  43. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/source_labels.py +0 -0
  44. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/tool_extractors.json +0 -0
  45. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/types.py +0 -0
  46. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/audit_local.py +0 -0
  47. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/audit_remote.py +0 -0
  48. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/canonical.py +0 -0
  49. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/__init__.py +0 -0
  50. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/__main__.py +0 -0
  51. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/_secrets.py +0 -0
  52. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/agent_config.py +0 -0
  53. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/console.py +0 -0
  54. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/debug_bundle.py +0 -0
  55. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/exec_cmd.py +0 -0
  56. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/hook_entry.py +0 -0
  57. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/hosts/__init__.py +0 -0
  58. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/hosts/unknown.py +0 -0
  59. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/kiro_adapter.py +0 -0
  60. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/migrate.py +0 -0
  61. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/output.py +0 -0
  62. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/spool_cmd.py +0 -0
  63. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/telemetry_consent.py +0 -0
  64. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/antigravity/hooks.json +0 -0
  65. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/antigravity.yaml +0 -0
  66. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/autogen.yaml +0 -0
  67. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/claude-code.yaml +0 -0
  68. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/codex-cli.yaml +0 -0
  69. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/cost-cap.yaml +0 -0
  70. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/crewai.yaml +0 -0
  71. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/cursor.yaml +0 -0
  72. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/gemini-cli.yaml +0 -0
  73. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/generic.yaml +0 -0
  74. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/kiro/ide-file-save.kiro.hook +0 -0
  75. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/kiro/ide-pre-tool-use.kiro.hook +0 -0
  76. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/kiro/ide-prompt-submit.kiro.hook +0 -0
  77. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/kiro/kiro.yaml +0 -0
  78. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/langchain.yaml +0 -0
  79. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/mcp.yaml +0 -0
  80. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/rag.yaml +0 -0
  81. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/update_cmd.py +0 -0
  82. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/client.py +0 -0
  83. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/device.py +0 -0
  84. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/enrollment.py +0 -0
  85. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/error_codes.py +0 -0
  86. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/error_codes.yaml +0 -0
  87. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/errors.py +0 -0
  88. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/hitl/__init__.py +0 -0
  89. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/hitl/grant_protocol.py +0 -0
  90. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/hitl/mock.py +0 -0
  91. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/hitl/pending_approval.py +0 -0
  92. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/hitl/secret_leak_guard.py +0 -0
  93. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/hitl/status.py +0 -0
  94. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/hook_integrity.py +0 -0
  95. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/hooks/__init__.py +0 -0
  96. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/hooks/tool_output_handler.py +0 -0
  97. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/hosted_policy.py +0 -0
  98. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/__init__.py +0 -0
  99. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/anthropic.py +0 -0
  100. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/autogen.py +0 -0
  101. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/braintrust.py +0 -0
  102. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/crewai/__init__.py +0 -0
  103. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/crewai/agent.py +0 -0
  104. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/crewai/crew.py +0 -0
  105. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/crewai/task.py +0 -0
  106. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/crewai/tool.py +0 -0
  107. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/google.py +0 -0
  108. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/google_adk/__init__.py +0 -0
  109. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/google_adk/agent.py +0 -0
  110. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/google_adk/tool.py +0 -0
  111. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/langchain/__init__.py +0 -0
  112. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/langchain/agent.py +0 -0
  113. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/langchain/callbacks.py +0 -0
  114. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/langchain/chain.py +0 -0
  115. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/langchain/graph.py +0 -0
  116. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/langchain/modern.py +0 -0
  117. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/langchain/tool.py +0 -0
  118. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/langfuse.py +0 -0
  119. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/litellm.py +0 -0
  120. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/openai.py +0 -0
  121. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/pydantic_ai.py +0 -0
  122. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/vercel_ai.py +0 -0
  123. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/layout_migration.py +0 -0
  124. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/policy_loader.py +0 -0
  125. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/secrets/__init__.py +0 -0
  126. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/secrets/reference.py +0 -0
  127. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/secrets/resolver.py +0 -0
  128. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/secrets/secretstr.py +0 -0
  129. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/spool/__init__.py +0 -0
  130. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/spool/_compress.py +0 -0
  131. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/spool/_constants.py +0 -0
  132. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/spool/_crc32c.py +0 -0
  133. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/spool/_crypto.py +0 -0
  134. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/spool/_frame.py +0 -0
  135. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/spool/_keyring.py +0 -0
  136. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/spool/_metrics.py +0 -0
  137. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/spool/_spool.py +0 -0
  138. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/spool/_state.py +0 -0
  139. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/spool/_uploader.py +0 -0
  140. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/spool/cz-audit-v1.dict +0 -0
  141. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/tamper.py +0 -0
  142. {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/tracecontext.py +0 -0
  143. {controlzero-1.13.1 → controlzero-1.13.3}/examples/hello_world.py +0 -0
  144. {controlzero-1.13.1 → controlzero-1.13.3}/tests/_fixtures/antigravity-envelope-expected.json +0 -0
  145. {controlzero-1.13.1 → controlzero-1.13.3}/tests/_fixtures/jcs_args_hash_vectors.json +0 -0
  146. {controlzero-1.13.1 → controlzero-1.13.3}/tests/conftest.py +0 -0
  147. {controlzero-1.13.1 → controlzero-1.13.3}/tests/integrations/__init__.py +0 -0
  148. {controlzero-1.13.1 → controlzero-1.13.3}/tests/integrations/test_google.py +0 -0
  149. {controlzero-1.13.1 → controlzero-1.13.3}/tests/parity/action_aliases.json +0 -0
  150. {controlzero-1.13.1 → controlzero-1.13.3}/tests/spool/__init__.py +0 -0
  151. {controlzero-1.13.1 → controlzero-1.13.3}/tests/spool/conftest.py +0 -0
  152. {controlzero-1.13.1 → controlzero-1.13.3}/tests/spool/test_spool_cli.py +0 -0
  153. {controlzero-1.13.1 → controlzero-1.13.3}/tests/spool/test_spool_concurrency.py +0 -0
  154. {controlzero-1.13.1 → controlzero-1.13.3}/tests/spool/test_spool_conformance.py +0 -0
  155. {controlzero-1.13.1 → controlzero-1.13.3}/tests/spool/test_spool_core.py +0 -0
  156. {controlzero-1.13.1 → controlzero-1.13.3}/tests/spool/test_spool_crash.py +0 -0
  157. {controlzero-1.13.1 → controlzero-1.13.3}/tests/spool/test_spool_diskfull.py +0 -0
  158. {controlzero-1.13.1 → controlzero-1.13.3}/tests/spool/test_spool_durable_default_tamper.py +0 -0
  159. {controlzero-1.13.1 → controlzero-1.13.3}/tests/spool/test_spool_keychain_dek.py +0 -0
  160. {controlzero-1.13.1 → controlzero-1.13.3}/tests/spool/test_spool_sink_wiring.py +0 -0
  161. {controlzero-1.13.1 → controlzero-1.13.3}/tests/spool/test_spool_transcript_localack.py +0 -0
  162. {controlzero-1.13.1 → controlzero-1.13.3}/tests/spool/test_spool_uploader.py +0 -0
  163. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_action_aliases.py +0 -0
  164. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_action_canonicalization.py +0 -0
  165. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_action_validator_t86.py +0 -0
  166. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_adapter_interface.py +0 -0
  167. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_agent_name_env.py +0 -0
  168. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_agy_docs_no_exit2_1373.py +0 -0
  169. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_antigravity_adapter.py +0 -0
  170. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_antigravity_envelope_parity.py +0 -0
  171. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_antigravity_ga_blockers_1248.py +0 -0
  172. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_antigravity_hook_check.py +0 -0
  173. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_antigravity_install.py +0 -0
  174. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_antigravity_posttooluse_observe_58.py +0 -0
  175. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_antigravity_tool_vocab_1303.py +0 -0
  176. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_api_key_mask.py +0 -0
  177. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_audit_project_id_attribution_pr2.py +0 -0
  178. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_audit_remote.py +0 -0
  179. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_audit_remote_io_capture.py +0 -0
  180. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_audit_remote_sdk_version.py +0 -0
  181. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_audit_sink_isolation.py +0 -0
  182. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_bundle_cache_freshness_1303.py +0 -0
  183. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_bundle_parser.py +0 -0
  184. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_bundle_translate.py +0 -0
  185. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_canonical_phase1a.py +0 -0
  186. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_capability_matrix_doc.py +0 -0
  187. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_cli_carve_out.py +0 -0
  188. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_cli_debug_bundle.py +0 -0
  189. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_cli_extractor_integration.py +0 -0
  190. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_cli_hook.py +0 -0
  191. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_cli_hook_entry.py +0 -0
  192. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_cli_hosted_refresh.py +0 -0
  193. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_cli_init.py +0 -0
  194. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_cli_init_templates.py +0 -0
  195. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_cli_tail.py +0 -0
  196. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_cli_test.py +0 -0
  197. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_cli_validate.py +0 -0
  198. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_coding_agent_hooks.py +0 -0
  199. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_condition_operators_1495.py +0 -0
  200. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_conditions.py +0 -0
  201. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_config_format_parity_1303.py +0 -0
  202. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_conformance.py +0 -0
  203. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_console.py +0 -0
  204. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_credential_hook.py +0 -0
  205. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_cursor_adapter.py +0 -0
  206. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_default_action.py +0 -0
  207. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_deny_rule_reconciliation_1011.py +0 -0
  208. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_device.py +0 -0
  209. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_dlp_mask.py +0 -0
  210. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_dlp_scanner.py +0 -0
  211. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_doctor.py +0 -0
  212. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_engine_version_consistency.py +0 -0
  213. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_enrollment.py +0 -0
  214. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_env_dump_438.py +0 -0
  215. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_epic_1247_bryan_acceptance.py +0 -0
  216. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_error_codes.py +0 -0
  217. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_errors_e_codes.py +0 -0
  218. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_fail_closed_eval.py +0 -0
  219. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_failopen_1303.py +0 -0
  220. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_glob_matching.py +0 -0
  221. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hitl_5d_email_install.py +0 -0
  222. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hitl_6a_cli_flag.py +0 -0
  223. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hitl_6a_exceptions.py +0 -0
  224. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hitl_6a_get_secret_hitl.py +0 -0
  225. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hitl_6a_mock_backend.py +0 -0
  226. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hitl_6a_pending_approval.py +0 -0
  227. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hitl_6a_request_approval.py +0 -0
  228. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hitl_6a_secret_leak_guard.py +0 -0
  229. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hitl_6a_wait.py +0 -0
  230. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hitl_conformance.py +0 -0
  231. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hitl_phase2b_protocol.py +0 -0
  232. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hitl_reason_codes.py +0 -0
  233. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hitl_validator_keys.py +0 -0
  234. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hook_extractors.py +0 -0
  235. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hook_integrity.py +0 -0
  236. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hook_mask_failclosed.py +0 -0
  237. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hosted_local_audit_1247.py +0 -0
  238. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hosted_local_shadow_warn_1265.py +0 -0
  239. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hosted_policy_e2e.py +0 -0
  240. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hosts_adapter.py +0 -0
  241. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hybrid_mode_strict.py +0 -0
  242. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hybrid_mode_warn.py +0 -0
  243. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_install_hook_command.py +0 -0
  244. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_install_hooks.py +0 -0
  245. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_io_capture_producer.py +0 -0
  246. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_kiro_adapter.py +0 -0
  247. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_kiro_cli_e2e.py +0 -0
  248. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_kiro_cli_hook_pin_1265.py +0 -0
  249. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_kiro_hook_templates.py +0 -0
  250. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_kiro_install.py +0 -0
  251. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_layout_migration_t101.py +0 -0
  252. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_layout_parity_t102.py +0 -0
  253. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_local_mode_dict.py +0 -0
  254. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_local_mode_file_json.py +0 -0
  255. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_local_mode_file_yaml.py +0 -0
  256. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_localized_reason.py +0 -0
  257. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_log_fallback_stderr.py +0 -0
  258. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_log_options_ignored_hosted.py +0 -0
  259. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_log_rotation.py +0 -0
  260. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_migrate.py +0 -0
  261. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_min_sdk_version_gate.py +0 -0
  262. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_multi_client_per_project_175.py +0 -0
  263. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_no_policy_no_key.py +0 -0
  264. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_observe_mode_1247.py +0 -0
  265. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_package_rename_shim.py +0 -0
  266. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_part3_active_policy_count_1303.py +0 -0
  267. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_per_client_isolation_1011.py +0 -0
  268. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_policy_engine_version_phase1b.py +0 -0
  269. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_policy_freshness.py +0 -0
  270. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_policy_load_failclosed_f3.py +0 -0
  271. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_policy_settings.py +0 -0
  272. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_policy_source_audit.py +0 -0
  273. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_pr4_install_messaging.py +0 -0
  274. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_pr4_output.py +0 -0
  275. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_pr4_status.py +0 -0
  276. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_probe_audit_isolation.py +0 -0
  277. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_quarantine.py +0 -0
  278. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_reason_code.py +0 -0
  279. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_refresh.py +0 -0
  280. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_secrets.py +0 -0
  281. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_secrets_reference_resolver.py +0 -0
  282. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_shell_semantic_class.py +0 -0
  283. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_source_labels.py +0 -0
  284. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_sql_semantic_class.py +0 -0
  285. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_synthetic_policy_id_t79.py +0 -0
  286. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_t103_precedence.py +0 -0
  287. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_t104_cache_gc.py +0 -0
  288. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_t108_local_override_audit.py +0 -0
  289. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_t96_single_audit_log.py +0 -0
  290. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_t99_install_prefetch_bundle.py +0 -0
  291. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_tamper.py +0 -0
  292. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_tamper_behavior.py +0 -0
  293. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_tamper_hook.py +0 -0
  294. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_telemetry_consent.py +0 -0
  295. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_tracecontext.py +0 -0
  296. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_unsafe_int_boundary.py +0 -0
  297. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_update_cmd.py +0 -0
  298. {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_upgrade_nudge.py +0 -0
  299. {controlzero-1.13.1 → controlzero-1.13.3}/tools/cz-kiro-adapter +0 -0
@@ -1,5 +1,43 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.13.3 (2026-06-29): `verify --prove` enforcement-robustness layer
4
+
5
+ ### Added
6
+
7
+ - **`controlzero verify --prove` actively PROVES enforcement instead of trusting
8
+ config.** Plain `verify` only checked that the hook config was present, so an
9
+ adapter could report green while its hooks never fired -- a "false-green"
10
+ install, the exact class behind the kiro-cli 2.10 and Codex hook-trust reports.
11
+ `--prove` runs a live probe that MUST be denied and confirms the governance hook
12
+ actually fired, reports the effective enforcement state, and validates against
13
+ per-adapter contract fixtures. Catches silent non-enforcement that config-only
14
+ checks miss.
15
+
16
+ ## 1.13.2 (2026-06-28): kiro-cli 2.10 install crash + cross-adapter hook hardening
17
+
18
+ ### Fixed
19
+
20
+ - **kiro-cli Windows / non-UTF-8 install crash (Ken Lee report).** `controlzero
21
+ kiro init` captured kiro-cli's output in text mode using the OS locale codec, so
22
+ kiro-cli's UTF-8 output crashed the install's subprocess reader thread on
23
+ non-UTF-8 Windows locales (Korean CP949, Japanese SJIS, Chinese GBK). That crash
24
+ could leave the governance agent not set as default, so `kiro-cli chat` then ran
25
+ the built-in default agent ungoverned (no hooks, no audit). All kiro-cli
26
+ shell-outs now decode as UTF-8 (`errors="replace"`) and never crash the install.
27
+ - **Codex hook-trust requirement surfaced at install.** Codex trust-gates the
28
+ non-managed `~/.codex/hooks.json` by hash and SKIPS it until trusted; the
29
+ installer now prints a loud ACTION-REQUIRED step (run `/hooks`, trust the Control
30
+ Zero hook, re-trust after every upgrade) instead of implying it enforces.
31
+ - **Gemini defensive hooks gate.** The installer writes `hooksConfig.enabled=true`
32
+ so an admin/older build with hooks gated off does not silently run ungoverned.
33
+
34
+ ### Notes
35
+
36
+ - kiro-cli 2.10 was verified live to FIRE embedded agent-config `preToolUse` hooks;
37
+ the canonical tool-name matchers (`execute_bash`/`fs_write`/`fs_read`/`use_aws`)
38
+ and the `"*"` all-tools token are correct on 2.10 (both new `shell` and legacy
39
+ `execute_bash` names match).
40
+
3
41
  ## 1.13.1 (2026-06-27): shell semantic-class enforcement
4
42
 
5
43
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: controlzero
3
- Version: 1.13.1
3
+ Version: 1.13.3
4
4
  Summary: AI agent governance: policies, audit, and observability for tool calls. Works locally with no signup.
5
5
  Project-URL: Homepage, https://controlzero.ai
6
6
  Project-URL: Documentation, https://docs.controlzero.ai
@@ -41,7 +41,7 @@ from controlzero.hitl.grant_protocol import (
41
41
  from controlzero.policy_loader import load_policy
42
42
  from controlzero.secrets import SecretRef, SecretStr, secret_ref
43
43
 
44
- __version__ = "1.13.1"
44
+ __version__ = "1.13.3"
45
45
 
46
46
  __all__ = [
47
47
  "Client",
@@ -457,6 +457,87 @@ def _check_antigravity_hook_live() -> List[Finding]:
457
457
  return findings
458
458
 
459
459
 
460
+ # -----------------------------------------------------------------------------
461
+ # Prove-enforcement live checks (R1 + R2) for the SAFE-NOW adapters.
462
+ #
463
+ # These generalize the Antigravity liveness check to every adapter via the
464
+ # shared controlzero.cli.enforcement module: a pure offline EFFECTIVE-STATE
465
+ # read (proves the AGENT will INVOKE our command -- gate on, hook trusted,
466
+ # default agent set, failClosed present, the CZ block in the precedence-winning
467
+ # layer) PLUS a real-deny PROBE through the EXACT installed command (proves the
468
+ # command resolves and actually denies). "Present but not effective" => ERROR,
469
+ # not a silent green. An adapter not configured on this box emits NO finding (a
470
+ # valid state); doctor exit 1 stays reserved for active problems.
471
+ # -----------------------------------------------------------------------------
472
+
473
+ # Adapters that can be proven offline today (Phase A+B / SAFE-NOW). Antigravity
474
+ # keeps its dedicated dry-run check above; codex trust is a WARN (needs-live).
475
+ _PROVE_ADAPTERS = ("claude_code", "cursor", "gemini_cli", "codex_cli", "kiro")
476
+
477
+
478
+ def _check_adapter_enforcement_live(adapter: str) -> List[Finding]:
479
+ """One prove-enforcement finding for an adapter (or none when it is not
480
+ installed on this box). ERROR when present-but-not-effective; WARN for
481
+ needs-live boundaries; silent when the adapter is absent."""
482
+ from controlzero.cli import enforcement
483
+
484
+ reader = enforcement.EFFECTIVE_STATE_READERS.get(adapter)
485
+ if reader is None:
486
+ return []
487
+ try:
488
+ state = reader()
489
+ except Exception: # noqa: BLE001
490
+ return []
491
+ if not state.installed:
492
+ return []
493
+
494
+ findings: List[Finding] = []
495
+ path = state.config_path or adapter
496
+
497
+ if not state.ok:
498
+ findings.append(Finding(
499
+ path=path, line=1, col=1, severity="ERROR", code="E1010",
500
+ message=(
501
+ f"{adapter} hook is configured but NOT effectively enforcing: "
502
+ + "; ".join(state.red_reasons)
503
+ ),
504
+ fix_hint=f"run `controlzero install {adapter.replace('_', '-')}` and re-check `controlzero verify --prove`",
505
+ ))
506
+ # Still surface needs-live warns alongside the error.
507
+ for w in state.warns:
508
+ findings.append(Finding(
509
+ path=path, line=1, col=1, severity="WARN", code="E1011",
510
+ message=f"{adapter}: {w}", fix_hint="see `controlzero verify --prove` for the live signal",
511
+ ))
512
+ return findings
513
+
514
+ # Effective-state holds -> drive a real deny through the installed command.
515
+ installed_cmd = enforcement.installed_command(adapter)
516
+ contract = enforcement.ADAPTER_CONTRACTS.get(adapter)
517
+ if installed_cmd and contract is not None:
518
+ res = enforcement.run_enforcement_probe(
519
+ installed_cmd,
520
+ adapter=adapter,
521
+ decision_via_exit_code=(contract.block_mechanism != "stdout_decision"),
522
+ )
523
+ if not res.blocked:
524
+ findings.append(Finding(
525
+ path=path, line=1, col=1, severity="ERROR", code="E1012",
526
+ message=(
527
+ f"{adapter} hook is wired but a real known-deny probe was NOT blocked "
528
+ f"(exit={res.exit_code}{', error=' + res.error if res.error else ''}) -- "
529
+ "the command does not resolve or does not enforce, tools run UNGOVERNED"
530
+ ),
531
+ fix_hint=f"reinstall (`controlzero install {adapter.replace('_', '-')}`); confirm the interpreter / PATH the hook resolves",
532
+ ))
533
+ for w in state.warns:
534
+ findings.append(Finding(
535
+ path=path, line=1, col=1, severity="WARN", code="E1011",
536
+ message=f"{adapter}: {w}", fix_hint="see `controlzero verify --prove` for the live signal",
537
+ ))
538
+ return findings
539
+
540
+
460
541
  # -----------------------------------------------------------------------------
461
542
  # Public entrypoint. Wired into the CLI as `controlzero doctor`.
462
543
  # -----------------------------------------------------------------------------
@@ -472,6 +553,8 @@ def run_doctor(verbose: bool = False) -> int:
472
553
  findings.extend(_check_config_permissions())
473
554
  findings.extend(_check_global_environment())
474
555
  findings.extend(_check_antigravity_hook_live())
556
+ for _adapter in _PROVE_ADAPTERS:
557
+ findings.extend(_check_adapter_enforcement_live(_adapter))
475
558
 
476
559
  errors = [f for f in findings if f.severity == "ERROR"]
477
560
  warns = [f for f in findings if f.severity == "WARN"]