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.
- {controlzero-1.13.1 → controlzero-1.13.3}/CHANGELOG.md +38 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/PKG-INFO +1 -1
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/__init__.py +1 -1
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/doctor.py +83 -0
- controlzero-1.13.3/controlzero/cli/enforcement.py +861 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/hosts/antigravity.py +1 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/hosts/base.py +10 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/hosts/claude_code.py +1 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/hosts/codex_cli.py +1 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/hosts/cursor.py +1 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/hosts/cursor_cli.py +1 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/hosts/gemini_cli.py +1 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/hosts/kiro.py +2 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/main.py +272 -110
- {controlzero-1.13.1 → controlzero-1.13.3}/pyproject.toml +1 -1
- controlzero-1.13.3/tests/fixtures/adapter-contracts/antigravity.json +21 -0
- controlzero-1.13.3/tests/fixtures/adapter-contracts/claude_code.json +31 -0
- controlzero-1.13.3/tests/fixtures/adapter-contracts/codex_cli.json +24 -0
- controlzero-1.13.3/tests/fixtures/adapter-contracts/cursor.json +31 -0
- controlzero-1.13.3/tests/fixtures/adapter-contracts/gemini_cli.json +25 -0
- controlzero-1.13.3/tests/fixtures/adapter-contracts/kiro.json +37 -0
- controlzero-1.13.3/tests/test_adapter_contracts.py +216 -0
- controlzero-1.13.3/tests/test_kiro_cli_v210_hooks.py +110 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/.gitignore +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/Dockerfile.test +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/LICENSE +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/README.md +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/__main__.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/__init__.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/_messages.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/action_aliases.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/action_validator.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/bundle.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/condition_ops.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/credential_hook.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/credential_scanner.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/credentials_data/__init__.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/credentials_data/built_in.yaml +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/dlp_scanner.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/enforcer.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/hook_extractors.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/io_capture_producer.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/source_labels.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/tool_extractors.json +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/_internal/types.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/audit_local.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/audit_remote.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/canonical.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/__init__.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/__main__.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/_secrets.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/agent_config.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/console.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/debug_bundle.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/exec_cmd.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/hook_entry.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/hosts/__init__.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/hosts/unknown.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/kiro_adapter.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/migrate.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/output.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/spool_cmd.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/telemetry_consent.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/antigravity/hooks.json +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/antigravity.yaml +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/autogen.yaml +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/claude-code.yaml +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/codex-cli.yaml +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/cost-cap.yaml +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/crewai.yaml +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/cursor.yaml +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/gemini-cli.yaml +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/generic.yaml +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/kiro/ide-file-save.kiro.hook +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/kiro/ide-pre-tool-use.kiro.hook +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/kiro/ide-prompt-submit.kiro.hook +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/kiro/kiro.yaml +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/langchain.yaml +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/mcp.yaml +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/templates/rag.yaml +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/cli/update_cmd.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/client.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/device.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/enrollment.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/error_codes.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/error_codes.yaml +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/errors.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/hitl/__init__.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/hitl/grant_protocol.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/hitl/mock.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/hitl/pending_approval.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/hitl/secret_leak_guard.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/hitl/status.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/hook_integrity.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/hooks/__init__.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/hooks/tool_output_handler.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/hosted_policy.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/__init__.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/anthropic.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/autogen.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/braintrust.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/crewai/__init__.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/crewai/agent.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/crewai/crew.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/crewai/task.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/crewai/tool.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/google.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/google_adk/__init__.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/google_adk/agent.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/google_adk/tool.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/langchain/__init__.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/langchain/agent.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/langchain/callbacks.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/langchain/chain.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/langchain/graph.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/langchain/modern.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/langchain/tool.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/langfuse.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/litellm.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/openai.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/pydantic_ai.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/integrations/vercel_ai.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/layout_migration.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/policy_loader.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/secrets/__init__.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/secrets/reference.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/secrets/resolver.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/secrets/secretstr.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/spool/__init__.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/spool/_compress.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/spool/_constants.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/spool/_crc32c.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/spool/_crypto.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/spool/_frame.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/spool/_keyring.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/spool/_metrics.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/spool/_spool.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/spool/_state.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/spool/_uploader.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/spool/cz-audit-v1.dict +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/tamper.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/controlzero/tracecontext.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/examples/hello_world.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/_fixtures/antigravity-envelope-expected.json +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/_fixtures/jcs_args_hash_vectors.json +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/conftest.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/integrations/__init__.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/integrations/test_google.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/parity/action_aliases.json +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/spool/__init__.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/spool/conftest.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/spool/test_spool_cli.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/spool/test_spool_concurrency.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/spool/test_spool_conformance.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/spool/test_spool_core.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/spool/test_spool_crash.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/spool/test_spool_diskfull.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/spool/test_spool_durable_default_tamper.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/spool/test_spool_keychain_dek.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/spool/test_spool_sink_wiring.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/spool/test_spool_transcript_localack.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/spool/test_spool_uploader.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_action_aliases.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_action_canonicalization.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_action_validator_t86.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_adapter_interface.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_agent_name_env.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_agy_docs_no_exit2_1373.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_antigravity_adapter.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_antigravity_envelope_parity.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_antigravity_ga_blockers_1248.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_antigravity_hook_check.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_antigravity_install.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_antigravity_posttooluse_observe_58.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_antigravity_tool_vocab_1303.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_api_key_mask.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_audit_project_id_attribution_pr2.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_audit_remote.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_audit_remote_io_capture.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_audit_remote_sdk_version.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_audit_sink_isolation.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_bundle_cache_freshness_1303.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_bundle_parser.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_bundle_translate.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_canonical_phase1a.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_capability_matrix_doc.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_cli_carve_out.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_cli_debug_bundle.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_cli_extractor_integration.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_cli_hook.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_cli_hook_entry.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_cli_hosted_refresh.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_cli_init.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_cli_init_templates.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_cli_tail.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_cli_test.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_cli_validate.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_coding_agent_hooks.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_condition_operators_1495.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_conditions.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_config_format_parity_1303.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_conformance.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_console.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_credential_hook.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_cursor_adapter.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_default_action.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_deny_rule_reconciliation_1011.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_device.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_dlp_mask.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_dlp_scanner.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_doctor.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_engine_version_consistency.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_enrollment.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_env_dump_438.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_epic_1247_bryan_acceptance.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_error_codes.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_errors_e_codes.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_fail_closed_eval.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_failopen_1303.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_glob_matching.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hitl_5d_email_install.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hitl_6a_cli_flag.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hitl_6a_exceptions.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hitl_6a_get_secret_hitl.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hitl_6a_mock_backend.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hitl_6a_pending_approval.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hitl_6a_request_approval.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hitl_6a_secret_leak_guard.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hitl_6a_wait.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hitl_conformance.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hitl_phase2b_protocol.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hitl_reason_codes.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hitl_validator_keys.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hook_extractors.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hook_integrity.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hook_mask_failclosed.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hosted_local_audit_1247.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hosted_local_shadow_warn_1265.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hosted_policy_e2e.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hosts_adapter.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hybrid_mode_strict.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_hybrid_mode_warn.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_install_hook_command.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_install_hooks.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_io_capture_producer.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_kiro_adapter.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_kiro_cli_e2e.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_kiro_cli_hook_pin_1265.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_kiro_hook_templates.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_kiro_install.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_layout_migration_t101.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_layout_parity_t102.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_local_mode_dict.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_local_mode_file_json.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_local_mode_file_yaml.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_localized_reason.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_log_fallback_stderr.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_log_options_ignored_hosted.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_log_rotation.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_migrate.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_min_sdk_version_gate.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_multi_client_per_project_175.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_no_policy_no_key.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_observe_mode_1247.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_package_rename_shim.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_part3_active_policy_count_1303.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_per_client_isolation_1011.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_policy_engine_version_phase1b.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_policy_freshness.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_policy_load_failclosed_f3.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_policy_settings.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_policy_source_audit.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_pr4_install_messaging.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_pr4_output.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_pr4_status.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_probe_audit_isolation.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_quarantine.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_reason_code.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_refresh.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_secrets.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_secrets_reference_resolver.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_shell_semantic_class.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_source_labels.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_sql_semantic_class.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_synthetic_policy_id_t79.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_t103_precedence.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_t104_cache_gc.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_t108_local_override_audit.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_t96_single_audit_log.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_t99_install_prefetch_bundle.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_tamper.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_tamper_behavior.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_tamper_hook.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_telemetry_consent.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_tracecontext.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_unsafe_int_boundary.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_update_cmd.py +0 -0
- {controlzero-1.13.1 → controlzero-1.13.3}/tests/test_upgrade_nudge.py +0 -0
- {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.
|
|
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
|
|
@@ -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"]
|