[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "butler-system" version = "4.0.0" description = "Butler v4 — 多项目微信 AI 管家:自建 Agent Loop、委派代理与分层记忆" readme = "README.md" requires-python = ">=3.11" license = { text = "MIT" } classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Software Development :: Libraries :: Application Frameworks", ] dependencies = [ "openai>=2.21.0,<3", "anthropic>=0.39.0,<1", "python-dotenv>=1.2.1,<2", "httpx[socks]>=0.28.1,<1", "rich>=14.3.3,<15", "tenacity>=9.1.4,<10", "pyyaml>=6.0.2,<7", "requests>=2.33.0,<3", "jinja2>=3.1.5,<4", "pydantic>=2.12.5,<3", "prompt_toolkit>=3.0.52,<4", "croniter>=6.0.0,<7", "PyJWT[crypto]>=2.12.0,<3", "tzdata>=2023.3; sys_platform == 'win32'", "psutil>=5.9.0,<8", "jieba>=0.42,<1", "aiosqlite>=0.20,<1", ] [project.optional-dependencies] wechat = ["aiohttp>=3.13.4,<4", "certifi", "qrcode>=7.0", "cryptography"] wechat-ocr = ["pytesseract>=0.3.10,<1", "pillow>=12.2.0,<13"] dev = ["debugpy>=1.8.0,<2", "pytest>=9.0.2,<10", "pytest-asyncio>=1.3.0,<2", "pytest-cov>=6.0,<7", "ruff", "mypy>=1.13,<2", "jsonschema>=4.20,<5", "networkx>=3.0,<4"] mcp = ["mcp>=1.2,<2"] cli = ["simple-term-menu>=1.0,<2"] voice = ["faster-whisper>=1.0.0,<2", "sounddevice>=0.4.6,<1", "numpy>=1.24.0,<3"] pty = ["ptyprocess>=0.7.0,<1; sys_platform != 'win32'", "pywinpty>=2.0.0,<3; sys_platform == 'win32'"] tokens = ["tiktoken>=0.7,<1"] embeddings = ["fastembed>=0.8.0,<1"] documents = ["markitdown[pdf,docx,xlsx,pptx]>=0.3,<1"] web = ["trafilatura>=2.0,<3"] notify = ["apprise>=1.9,<2"] analytics = ["duckdb>=1.1,<2"] vectors = ["chromadb>=0.6,<1"] observability = ["langfuse>=2.0,<3"] eval-deepeval = ["deepeval>=2.0,<4"] eval-ragas = ["ragas>=0.2,<1"] gateway = [ "butler-system[wechat]", "butler-system[mcp]", "butler-system[embeddings]", "butler-system[vectors]", "butler-system[web]", ] all = [ "butler-system[wechat]", "butler-system[wechat-ocr]", "butler-system[cli]", "butler-system[dev]", "butler-system[voice]", "butler-system[pty]", "butler-system[embeddings]", "butler-system[vectors]", "butler-system[observability]", "butler-system[tokens]", ] [project.scripts] butler = "butler.main:main" scan-magicmock-spec = "butler.tests_policies.scan_magicmock_spec:main" [tool.setuptools.packages.find] where = ["."] include = ["butler", "butler.*"] [tool.pytest.ini_options] testpaths = ["tests"] norecursedirs = ["archive", "fixtures", ".git", "node_modules", "venv"] markers = [ "unit: L1 unit tests (fast, no I/O)", "module_test: L2 module tests (mocked I/O)", "integration: L3 integration tests (cross-module)", "e2e: L4 end-to-end tests (full pipeline)", "slow: tests taking > 5s", "live_llm: requires real LLM API key (skip in CI)", "corpus: corpus-driven evaluation (tests/corpus)", "corpus_mock: corpus tests with mocked LLM (CI)", "corpus_live: corpus tests with real LLM (implies live_llm)", "corpus_smoke: corpus live smoke subset only", "conversational: human-like conversational tests with real LLM (implies live_llm)", "live_vlm: requires real MiniMax VLM API (image recognition tests)", "live_multimodal: requires real MiniMax multimodal API (image gen / TTS tests)", "gateway: tests/gateway/ domain (微信网关、斜杠命令)", "ops: tests/ops/ domain (eval、观测、metrics)", "dev_engine: tests/dev_engine/ domain (VERIFY、委派验证)", "legacy_sprint: 历史 sprint 回归(2026-07-11 已全量迁出 tests/ 根目录,conftest.py auto-marker 失效;保留以防新 sprint 测试需手工 tag)", ] addopts = "-m 'not live_llm'" filterwarnings = [ "ignore:pkg_resources is deprecated:UserWarning:jieba._compat", ] [tool.ruff] target-version = "py311" line-length = 120 [tool.ruff.lint] select = ["E", "F", "W"] ignore = [ "E501", # line too long — enforced by review, not CI "E402", # module level import not at top — lazy imports are intentional "F811", # redefinition of unused name — common with lazy import pattern ] [tool.mypy] python_version = "3.11" warn_return_any = true warn_unused_configs = true check_untyped_defs = true plugins = ["pydantic.mypy"] [[tool.mypy.overrides]] module = "butler.contracts.*" strict = true [[tool.mypy.overrides]] module = [ "butler.core.__init__", "butler.core.agent_loop", "butler.core.agent_loop_phases", "butler.core.agents_md_sections", "butler.core.approval_cards", "butler.core.auto_continue", "butler.core.auto_review", "butler.core.batch_sequence_guard", "butler.core.best_effort", "butler.core.cache_safe_delegate", "butler.core.compaction_checkpoint", "butler.core.compaction_context_adapter", "butler.core.compaction_cutoff", "butler.core.compaction_phase", "butler.core.compaction_prompt", "butler.core.compaction_status", "butler.core.compaction_steer_bridge", "butler.core.compaction_task", "butler.core.confirm_flags", "butler.core.context_budget", "butler.core.context_compress_hooks", "butler.core.context_compress_pipeline", "butler.core.context_compress_support", "butler.core.context_compressor", "butler.core.context_pipeline", "butler.core.context_transform_registry", "butler.core.correction_intent", "butler.core.delegate_context", "butler.core.delegate_semaphore", "butler.core.design_md_sections", "butler.core.dev_context_adapter", "butler.core.dev_state_context_adapter", "butler.core.events_sink", "butler.core.evidence_extract", "butler.core.exp_cache", "butler.core.fact_extraction", "butler.core.finish_tool_truncate", "butler.core.goal_loop", "butler.core.handoff", "butler.core.harness_flags", "butler.core.hashline", "butler.core.hook_context_adapter", "butler.core.hygiene_preflight", "butler.core.inline_tool_compress", "butler.core.input_stage", "butler.core.instruction_walkup", "butler.core.intent_keywords", "butler.core.interrupt", "butler.core.io_guardrail", "butler.core.json_repair", "butler.core.llm_retry", "butler.core.llm_retry_errors", "butler.core.llm_retry_helpers", "butler.core.llm_retry_invoke", "butler.core.llm_retry_outcomes", "butler.core.llm_retry_safe", "butler.core.llm_retry_success", "butler.core.loop_budget_nudge", "butler.core.loop_callbacks_merge", "butler.core.loop_middleware", "butler.core.loop_plugins", "butler.core.loop_response", "butler.core.loop_stuck", "butler.core.loop_types", "butler.core.memory_context_adapter", "butler.core.memory_recap_line", "butler.core.memory_source_surface", "butler.core.message_context_adapter", "butler.core.message_ir", "butler.core.message_repair", "butler.core.message_sanitize", "butler.core.meta_flags", "butler.core.metrics_sink", "butler.core.mode_classifier", "butler.core.model_context", "butler.core.output_grounding", "butler.core.output_schema_registry", "butler.core.parallel_tools", "butler.core.pim_state", "butler.core.pipeline_steps", "butler.core.plan_reason_graph", "butler.core.plan_snapshot", "butler.core.post_commit", "butler.core.post_compact_cleanup", "butler.core.post_edit_format", "butler.core.preemptive_compact", "butler.core.preread_context", "butler.core.prompt_renderer", "butler.core.reactive_compact", "butler.core.read_file_partial", "butler.core.read_state", "butler.core.reasoning_trace", "butler.core.reflection_closure", "butler.core.reflexion_ephemeral", "butler.core.reflexion_write", "butler.core.remote_compact", "butler.core.research_simplicity", "butler.core.retry_policy", "butler.core.review_context_adapter", "butler.core.rules_engine", "butler.core.safety_finish", "butler.core.schema_optimizer", "butler.core.schema_recovery", "butler.core.session_epoch", "butler.core.session_hydration", "butler.core.session_recall_intent", "butler.core.session_todos", "butler.core.session_tool_index", "butler.core.session_transcript", "butler.core.skill_compact_rescue", "butler.core.skill_tool_bridge", "butler.core.steer", "butler.core.streaming_tools", "butler.core.structured_events", "butler.core.system_reminder", "butler.core.task_route_hints", "butler.core.text_truncate", "butler.core.todo_continuation", "butler.core.tool_batch", "butler.core.tool_batch_finalize", "butler.core.tool_batch_hooks", "butler.core.tool_batch_runner", "butler.core.tool_batch_state", "butler.core.tool_call_limits", "butler.core.tool_call_normalize", "butler.core.tool_dispatch", "butler.core.tool_dispatch_doom", "butler.core.tool_error_policy", "butler.core.tool_loop_detect", "butler.core.tool_narrative", "butler.core.tool_orchestrator", "butler.core.tool_output_masking", "butler.core.tool_output_prune", "butler.core.tool_pair_repair", "butler.core.tool_prune_policy", "butler.core.tool_recall_bm25", "butler.core.tool_result_cache", "butler.core.tool_result_classification", "butler.core.tool_result_storage", "butler.core.tool_retry", "butler.core.tool_selector", "butler.core.transcript_export", "butler.core.transcript_fork", "butler.core.transcript_fts", "butler.core.transcript_index", "butler.core.transcript_retention", "butler.core.transcript_revert", "butler.core.transcript_search", "butler.core.transform_feedback", "butler.core.transform_overrides", "butler.core.turn_compaction", "butler.core.turn_summary_line", "butler.core.turn_token_budget", "butler.core.two_phase_confirm", "butler.core.workflow_flags", "butler.dag_scheduler", "butler.defaults.model_defaults", "butler.dev_engine.__init__", "butler.dev_engine.b9_delegate_gate", "butler.dev_engine.b9_experience_retrieval", "butler.dev_engine.b9_live_fixed_tasks", "butler.dev_engine.b9_live_tuning", "butler.dev_engine.b9_oracle_curriculum", "butler.dev_engine.b9_oracle_fewshot", "butler.dev_engine.b9_prod_shaped_tasks", "butler.dev_engine.b9_tiers", "butler.dev_engine.b9_types", "butler.dev_engine.b9_verify_utils", "butler.dev_engine.code_search", "butler.dev_engine.coding_knowledge", "butler.dev_engine.coding_knowledge_benchmark", "butler.dev_engine.coding_knowledge_fixup", "butler.dev_engine.delegate_finalize", "butler.dev_engine.delegate_init", "butler.dev_engine.delegate_workspace", "butler.dev_engine.dev_benchmark", "butler.dev_engine.dev_context", "butler.dev_engine.dev_loop", "butler.dev_engine.dev_metrics", "butler.dev_engine.dev_state", "butler.dev_engine.dev_tools", "butler.dev_engine.diagnostics", "butler.dev_engine.fix_strategy", "butler.dev_engine.gentc_mutation", "butler.dev_engine.llm_delegate_benchmark", "butler.dev_engine.loop_plugin", "butler.dev_engine.optimize_advisory", "butler.dev_engine.prod_delegate_bridge", "butler.dev_engine.prod_playbook_seeds", "butler.dev_engine.project_dev_env", "butler.dev_engine.review_closure", "butler.dev_engine.review_knowledge", "butler.dev_engine.review_static", "butler.dev_engine.swe_curriculum", "butler.dev_engine.swebench_lite", "butler.dev_engine.verify", "butler.gate_reply_templates", "butler.gateway.__init__", "butler.gateway.approval_cards", "butler.gateway.bot_loop_guard", "butler.gateway.command_registry", "butler.gateway.completion_notify", "butler.gateway.completion_telemetry", "butler.gateway.delegate_push_dedup", "butler.gateway.delegate_task_kind", "butler.gateway.error_cards", "butler.gateway.events_sink", "butler.gateway.events_sink_impl", "butler.gateway.ext5_phrases", "butler.gateway.gate_reply_templates", "butler.gateway.gateway_contracts", "butler.gateway.gateway_transcript", "butler.gateway.handler_commands", "butler.gateway.handler_helpers", "butler.gateway.hooks", "butler.gateway.inbound_drain", "butler.gateway.inbound_idempotency", "butler.gateway.inbound_media", "butler.gateway.inbound_pipeline", "butler.gateway.inbound_validate", "butler.gateway.internal_leak_scrub", "butler.gateway.item_event_sink", "butler.gateway.item_events", "butler.gateway.locked_phase_registry", "butler.gateway.locked_phases", "butler.gateway.locked_turn_orchestrator", "butler.gateway.media_diagnostic_ops", "butler.gateway.media_telemetry", "butler.gateway.message_handler", "butler.gateway.message_pipelines", "butler.gateway.message_pipelines_fail_closed", "butler.gateway.message_queue", "butler.gateway.minimax_image_gen", "butler.gateway.minimax_tts", "butler.gateway.minimax_vlm", "butler.gateway.network_route_verify_runner", "butler.gateway.outbound_bridge", "butler.gateway.outbound_delay", "butler.gateway.outbound_events", "butler.gateway.outbound_files", "butler.gateway.outbound_prefs", "butler.gateway.owner_delegate_shortcuts", "butler.gateway.owner_gate", "butler.gateway.owner_ingest_shortcuts", "butler.gateway.owner_surface", "butler.gateway.pii_scrub", "butler.gateway.platform_policy", "butler.gateway.progressive_stream", "butler.gateway.queue_settings", "butler.gateway.reply_admission", "butler.gateway.runner", "butler.gateway.session_lifecycle", "butler.gateway.session_loop_factory", "butler.gateway.session_registry", "butler.gateway.singleton_lock", "butler.gateway.speech_stt", "butler.gateway.task_milestone", "butler.gateway.turn_post_pipeline", "butler.gateway.user_errors", "butler.gateway.vision_fallback", "butler.gateway.wechat_scenario_sim", "butler.gateway.wechat_text_export", "butler.hooks.__init__", "butler.hooks.loader", "butler.hooks.runner", "butler.hooks.telemetry", "butler.mcp.__init__", "butler.mcp.approval", "butler.mcp.async_runner", "butler.mcp.bridge", "butler.mcp.classify", "butler.mcp.client_http", "butler.mcp.client_stdio", "butler.mcp.config", "butler.mcp.deferred", "butler.mcp.diagnostics", "butler.mcp.extension_grounding", "butler.mcp.extension_manifest", "butler.mcp.extension_verify", "butler.mcp.github_grounding", "butler.mcp.github_tool_aliases", "butler.mcp.manager", "butler.mcp.naming", "butler.mcp.outbound_grounding_gate", "butler.mcp.profiles", "butler.mcp.registry_hook", "butler.mcp.result_slim", "butler.mcp.schema_normalize", "butler.mcp.server_stdio", "butler.mcp.todoist_grounding", "butler.mcp.todoist_tool_aliases", "butler.mcp.tools_engine", "butler.mcp.tools_manifest", "butler.mcp.turn_scrape_dedup", "butler.mcp.types", "butler.memory.__init__", "butler.memory.butler_memory", "butler.memory.chunking", "butler.memory.coding_recall", "butler.memory.corpus_router", "butler.memory.corrective_recall", "butler.memory.diagnostics", "butler.memory.diagnostics_collect", "butler.memory.document_ingest", "butler.memory.embedding", "butler.memory.experience_consolidation", "butler.memory.experience_mining", "butler.memory.experience_mining_cli", "butler.memory.facade", "butler.memory.injection_guard", "butler.memory.injection_llm_score", "butler.memory.knowledge_db", "butler.memory.memory_benchmark", "butler.memory.memory_caps", "butler.memory.memory_metrics", "butler.memory.memory_scope", "butler.memory.metrics_persist", "butler.memory.observation_migrate", "butler.memory.observation_recall", "butler.memory.observation_store", "butler.memory.observer_queue", "butler.memory.owner_experience_seed", "butler.memory.owner_write_pending", "butler.memory.pending_cli", "butler.memory.pending_command_ops", "butler.memory.pending_handlers", "butler.memory.prefetch_cache", "butler.memory.prefetch_retrieval_metrics", "butler.memory.private_tags", "butler.memory.project_memory", "butler.memory.query_decompose", "butler.memory.query_relaxation", "butler.memory.recall_layers", "butler.memory.recall_scopes", "butler.memory.reindex", "butler.memory.retrieval_ranking", "butler.memory.retrieval_telemetry", "butler.memory.scope_diagnostics", "butler.memory.search_cli", "butler.memory.search_result", "butler.memory.semantic_config", "butler.memory.semantic_health", "butler.memory.semantic_index", "butler.memory.semantic_project", "butler.memory.transcript_memory_pipeline", "butler.memory.transcript_recall", "butler.memory.triplets", "butler.memory.unified_recall", "butler.memory.unified_recall_config", "butler.memory.vector_gc", "butler.memory.vector_store", "butler.memory.vector_sync_telemetry", "butler.ops.__init__", "butler.ops.agent_eval_weekly", "butler.ops.assistant_health", "butler.ops.b9_failure_analysis", "butler.ops.b9_harness_audit", "butler.ops.b9_lessons", "butler.ops.b9_prod_promoted_registry", "butler.ops.b9_prod_weekly", "butler.ops.boundary_observability", "butler.ops.butler_inbox", "butler.ops.compaction_audit", "butler.ops.cost_calibration", "butler.ops.cost_calibration_cli", "butler.ops.cost_tracker", "butler.ops.degradation_registry", "butler.ops.delegate_failure_b9_import", "butler.ops.delegate_failure_b9_promote", "butler.ops.delegate_failure_capture", "butler.ops.delegate_judge", "butler.ops.deploy_profile", "butler.ops.dev_eval", "butler.ops.dual_playbook_probe", "butler.ops.embedding_diagnostics", "butler.ops.embedding_health", "butler.ops.env_profiles", "butler.ops.eval_actions", "butler.ops.eval_bridge", "butler.ops.eval_config_overrides", "butler.ops.eval_diagnostics", "butler.ops.eval_experiment", "butler.ops.eval_feedback", "butler.ops.eval_regression", "butler.ops.eval_scoring", "butler.ops.eval_turn", "butler.ops.execution_surface_collect", "butler.ops.execution_surface_diagnostics", "butler.ops.experience_selection_telemetry", "butler.ops.experiment_diagnostics", "butler.ops.g1_04_prod_evidence", "butler.ops.harness_diagnostics", "butler.ops.head_to_head", "butler.ops.head_to_head_common", "butler.ops.head_to_head_t1", "butler.ops.health_report", "butler.ops.health_report_turn", "butler.ops.hermes_gate", "butler.ops.langfuse_tracer", "butler.ops.lazy_import_budget", "butler.ops.lingwen1_capture_probe", "butler.ops.lingwen1_delegate_drill", "butler.ops.lingwen1_failure_seed", "butler.ops.lingwen1_prod_sample", "butler.ops.memory_eval", "butler.ops.morning_brief_push", "butler.ops.observation_diagnostics", "butler.ops.onboard", "butler.ops.openclaw_diagnostics", "butler.ops.owner_brief_blocks", "butler.ops.owner_feedback", "butler.ops.owner_pmf_metrics", "butler.ops.owner_quality_surface", "butler.ops.owner_trust_surface", "butler.ops.prod_experience_effectiveness", "butler.ops.production_failure_experience", "butler.ops.rag_diagnostics", "butler.ops.registry_diagnostics", "butler.ops.retry_buckets", "butler.ops.runtime_metrics", "butler.ops.runtime_metrics_sink", "butler.ops.secrets_contract", "butler.ops.secrets_contract_cli", "butler.ops.security_audit", "butler.ops.snapshot", "butler.ops.stack_diagnostics", "butler.ops.swebench_entry_gate", "butler.ops.swebench_live_eval", "butler.ops.tcr_report", "butler.ops.tcr_strict_readiness", "butler.ops.terminal_sandbox_diagnostics", "butler.ops.token_cost_diagnostics", "butler.ops.tool_routing", "butler.ops.transcript_diagnostics", "butler.ops.usage_ledger", "butler.ops.wechat_corpus_eval", "butler.ops.wechat_dataset", "butler.orchestrator.__init__", "butler.orchestrator.loop_factory", "butler.orchestrator.memory_bridge", "butler.orchestrator.prompt_assembler", "butler.orchestrator.skill_bridge", "butler.orchestrator.templates", "butler.runtime.__init__", "butler.runtime.approval", "butler.runtime.async_delegate", "butler.runtime.audit", "butler.runtime.builtin_handlers", "butler.runtime.cc_bridge", "butler.runtime.consistency_outcome", "butler.runtime.delegate_job", "butler.runtime.delegate_job_finalize", "butler.runtime.delegate_progress", "butler.runtime.delegate_registry", "butler.runtime.diagnostics", "butler.runtime.failure_tracker", "butler.runtime.loader", "butler.runtime.notify", "butler.runtime.push_queue", "butler.runtime.runner", "butler.runtime.schedule", "butler.runtime.schema", "butler.runtime.service", "butler.runtime.summary_enrich", "butler.runtime.task_store", "butler.runtime.workflow_version", "butler.session.__init__", "butler.session.auto_title", "butler.session.keys", "butler.session.lifecycle", "butler.session.memory_prefetch", "butler.session.new_session", "butler.session.post_session", "butler.session.post_session_guard", "butler.session.post_session_layered", "butler.skills.__init__", "butler.skills.consolidator", "butler.skills.experience_pointers", "butler.skills.fusion_wiring", "butler.skills.guard", "butler.skills.injection_policy", "butler.skills.layout", "butler.skills.learn", "butler.skills.lint", "butler.skills.manager", "butler.skills.router", "butler.skills.seed_bundled", "butler.skills.similarity", "butler.skills.usage", "butler.skills.write_approval", "butler.tools.__init__", "butler.tools._file_cache", "butler.tools.audit_persist", "butler.tools.builtin_impl", "butler.tools.builtin_register", "butler.tools.butlerignore", "butler.tools.command_canonicalize", "butler.tools.config_tools", "butler.tools.contacts", "butler.tools.data_query", "butler.tools.delegate_impl", "butler.tools.delegate_phases", "butler.tools.delegate_prepare", "butler.tools.delegate_record", "butler.tools.delegate_report", "butler.tools.delegate_role_guard", "butler.tools.delegate_run", "butler.tools.delegate_run_state", "butler.tools.delegate_subagent", "butler.tools.delegate_summary_budget", "butler.tools.delegate_yield_tools", "butler.tools.document_reader", "butler.tools.download_tools", "butler.tools.execute_code", "butler.tools.expense", "butler.tools.file_io", "butler.tools.git_tools", "butler.tools.habits", "butler.tools.interrupt", "butler.tools.knowledge_search", "butler.tools.mcp_self_service", "butler.tools.memo", "butler.tools.memory_tools", "butler.tools.multimodal_tools", "butler.tools.network_route_verify", "butler.tools.network_search_policy", "butler.tools.orthogonality_lint", "butler.tools.path_safety", "butler.tools.pim_schema", "butler.tools.project_todos", "butler.tools.project_tools", "butler.tools.provider_layers", "butler.tools.registry", "butler.tools.registry_gates", "butler.tools.registry_tools", "butler.tools.reminder", "butler.tools.runtime_tools", "butler.tools.safe_root", "butler.tools.session_todos_tools", "butler.tools.tenant_store", "butler.tools.terminal_approval", "butler.tools.terminal_danger", "butler.tools.terminal_impl", "butler.tools.terminal_pattern_approval", "butler.tools.terminal_sandbox", "butler.tools.tool_arg_normalize", "butler.tools.tool_audit", "butler.tools.tool_doc_templates", "butler.tools.tool_implicit_context", "butler.tools.tool_schemas", "butler.tools.toolset_profiles", "butler.tools.web_fetch", "butler.tools.web_search", "butler.tools.web_search_probe", "butler.tools.workflow_tools", "butler.transport.__init__", "butler.transport.anthropic_transport", "butler.transport.auxiliary_client", "butler.transport.base", "butler.transport.cache_control", "butler.transport.chat_completions", "butler.transport.content_sanitize", "butler.transport.error_classifier", "butler.transport.fallback", "butler.transport.fusion_client", "butler.transport.interruptible_client", "butler.transport.llm_client", "butler.transport.memory_context_scrubber", "butler.transport.model_capabilities", "butler.transport.model_context", "butler.transport.provider_health", "butler.transport.providers", "butler.transport.reasoning_replay", "butler.transport.retry_utils", "butler.transport.schema_sanitizer", "butler.transport.stream_probe", "butler.transport.streaming_signal", "butler.transport.think_scrubber", "butler.transport.thinking_headers", "butler.transport.thinking_protocol", "butler.transport.tool_wire", "butler.transport.types", "butler.transport.usage_normalize", "butler.workflow_step_runner", "butler.registry.__init__", "butler.registry.audit", "butler.registry.mcp_catalog_remote", "butler.registry.registry_errors", "butler.registry.skill_lock", "butler.registry.skill_sources.__init__", "butler.registry.skill_sources.base", "butler.registry.skill_sources.zip_safety", "butler.registry.skill_types", "butler.registry.hub_manifest", "butler.registry.mcp_catalog", "butler.registry.skill_sources.bundled", "butler.registry.skill_sources.project", "butler.registry.skill_sources.url", "butler.workflows.__init__", "butler.workflows.artifact_paths", "butler.workflows.callbacks", "butler.workflows.schema", "butler.workflows.until_assert", "butler.workflows.validate", "butler.workflows.variables", "butler.workflows.pause_state", "butler.workflows.runner", "butler.workflows.workflow_run_snapshot", "butler.delegate.__init__", "butler.delegate.category_resolver", "butler.delegate.task_kind", "butler.delegate.owner_ingest_shortcuts", "butler.permissions.__init__", "butler.permissions.rules_fail_closed", "butler.permissions.tool_boundary_registry", "butler.project.__init__", "butler.project.archetypes", "butler.project.lead", "butler.project.plugins", "butler.registry.catalog_integrity", "butler.registry.install_pending", "butler.registry.mcp_project_tools", "butler.registry.mcp_ssot", "butler.registry.skill_install", "butler.registry.skill_normalize", "butler.registry.skill_sources.clawhub", "butler.registry.skill_sources.lobehub", "butler.registry.skill_sources.marketplace", "butler.registry.skills_project_sync", "butler.registry.skills_ssot", "butler.workflows.loader", "butler.permissions.doom_loop", "butler.permissions.rules", "butler.project.manager", "butler.project.meta", "butler.project.preflight", "butler.project.worktree", "butler.registry.hub_index_cache", "butler.registry.install_scan", "butler.registry.skill_service", "butler.registry.skill_sources.github", "butler.delegate.policy", "butler.delegate.subagent_permissions", "butler.permissions.approvals", "butler.registry.mcp_merge", "butler.registry.url_safety", "butler.registry.marketplace_compat", "butler.workflows.commands", "butler.registry.paths", "butler.registry.mcp_install", "butler.permissions.rules_context", "butler.project.model", "butler.__init__", "butler.config_service", "butler.env_parse", "butler.logging_config", "butler.memory_plugin", "butler.tenant", "butler.io.atomic_write", "butler.experiments.__init__", "butler.experiments.ledger", "butler.experiments.metrics", "butler.agent_profiles", "butler.agents_md", "butler.memory_settings", "butler.provider_presets", "butler.experiments.outcomes", "butler.experiments.crash_guard", "butler.experiments.git_utils", "butler.context_settings", "butler.config_secrets", "butler.model_resolve", "butler.tool_guardrails", "butler.main", "butler.experiments.mode", "butler.config", "butler.config_secrets_crypto", "butler.io.safe_load", "butler.human_gate", "butler.execution_context", "butler.task_orchestrator", "butler.gateway_settings", "butler.cli.__init__", "butler.cli.doctor", "butler.cli.spinner", "butler.eval_integration.__init__", "butler.eval_integration.presets", "butler.eval_integration.report_schema", "butler.eval_integration.sinks.__init__", "butler.eval_integration.suite_registry", "butler.eval_integration.suites.__init__", "butler.eval_integration.suites.agent_weekly_suite", "butler.eval_integration.suites.deepeval_suite", "butler.eval_integration.suites.hermes_gate_suite", "butler.eval_integration.suites.ragas_suite", "butler.eval_integration.suites.regression_suite", "butler.eval_integration.suites.wechat_corpus_suite", "butler.eval_integration.sync_policy", "butler.defaults.__init__", "butler.defaults.env_defaults", "butler.defaults.env_domains", "butler.report.__init__", "butler.report.acceptance_card", "butler.cli.eval_cli", "butler.cli.experiment_cli", "butler.cli.onboard_cli", "butler.cli.prompt_eval_cli", "butler.cli.provider_presets_cli", "butler.cli.registry_cli", "butler.cli.secrets_cli", "butler.cli.stream", "butler.cli.transcript_cli", "butler.cli.workflow_cli", "butler.eval_integration.oss.prefetch_audit_loader", "butler.eval_integration.sinks.audit_sink", "butler.eval_integration.sinks.deepeval_sink", "butler.eval_integration.sinks.junit_sink", "butler.eval_integration.sinks.langfuse_sink", "butler.eval_integration.sinks.ragas_sink", "butler.eval_integration.suites.b9_oracle_suite", "butler.eval_integration.suites.capability_suite", "butler.eval_integration.suites.memory_mb_suite", "butler.eval_integration.suites.tcr_suite", "butler.report.store", "butler.cli.slash_dispatch", "butler.cli.memory_cli", "butler.eval_integration.manager", "butler.report.format", "butler.report.generator", "butler.eval_integration.oss.deepeval_runner", "butler.eval_integration.oss.ragas_runner", "butler.execpolicy.__init__", "butler.extensions.__init__", "butler.plan.__init__", "butler.prompt_eval.__init__", "butler.tests_policies.__init__", "butler.transport.multimodal.__init__", "butler.transport.multimodal.minimax_tts", "butler.gateway.commands.__init__", "butler.gateway.platforms.__init__", "butler.gateway.platforms.base", "butler.gateway.platforms.helpers", "butler.gateway.platforms.types", "butler.gateway.platforms.wechat", "butler.gateway.platforms.wechat_format", "butler.gateway.platforms.wechat_ilink.account", "butler.gateway.platforms.wechat_ilink.constants", "butler.gateway.platforms.wechat_ilink.crypto", "butler.gateway.platforms.wechat_ilink.direct", "butler.gateway.platforms.wechat_ilink.media", "butler.gateway.platforms.wechat_ilink.poll_phases", "butler.gateway.platforms.wechat_ilink.qr_phases", "butler.gateway.platforms.wechat_ilink.registry", "butler.gateway.commands.dev_commands", "butler.gateway.commands.outcome_handlers", "butler.gateway.commands.sandbox_commands", "butler.gateway.commands.sessions_handlers", "butler.gateway.platforms.wechat_ilink.__init__", "butler.gateway.platforms.wechat_ilink.adapter_inbound", "butler.gateway.platforms.wechat_ilink.connect_phases", "butler.gateway.platforms.wechat_ilink.qr_login", "butler.gateway.platforms.wechat_ilink_constants", "butler.gateway.platforms.wechat_ilink_direct", "butler.gateway.platforms.wechat_ilink_phases", "butler.gateway.platforms.wechat_ilink_registry", "butler.gateway.platforms.wechat_ilink_utils", "butler.plan.markdown_sync", "butler.plan.store", "butler.prompt_eval.runner", "butler.tests_policies.scan_magicmock_spec", "butler.transport.multimodal.minimax_image_gen", "butler.cli.chat_cli", "butler.cli.cost_cli", "butler.cli.display", "butler.cli.doctor_sections", "butler.cli.gateway_cli", "butler.cli.mcp_catalog_cli", "butler.cli.mcp_cli", "butler.cli.projects_cli", "butler.cli.runtime_cli", "butler.cli.session_ui", "butler.cli.sessions_cli", "butler.cli.skills_registry", "butler.cli.slash_commands", "butler.execpolicy.engine", "butler.extensions.opencode", "butler.gateway.commands.cc_bridge_commands", "butler.gateway.commands.dev_handlers", "butler.gateway.commands.dialog_commands", "butler.gateway.commands.experience_commands", "butler.gateway.commands.export_handlers", "butler.gateway.commands.help_handlers", "butler.gateway.commands.info_commands", "butler.gateway.commands.lifecycle_commands", "butler.gateway.commands.memory_commands", "butler.gateway.commands.memory_handlers", "butler.gateway.commands.owner_shortcut_commands", "butler.gateway.commands.permission_commands", "butler.gateway.commands.project_commands", "butler.gateway.commands.project_handlers", "butler.gateway.commands.registry_handlers", "butler.gateway.commands.runtime_commands", "butler.gateway.commands.runtime_handlers", "butler.gateway.commands.skill_commands", "butler.gateway.platforms.wechat_ilink._compat", "butler.gateway.platforms.wechat_ilink._utils_legacy", "butler.gateway.platforms.wechat_ilink.adapter", "butler.gateway.platforms.wechat_ilink.adapter_lifecycle", "butler.gateway.platforms.wechat_ilink.adapter_media", "butler.gateway.platforms.wechat_ilink.adapter_outbound", "butler.gateway.platforms.wechat_ilink.phases", "butler.gateway.platforms.wechat_ilink.send_phases", "butler.gateway.platforms.wechat_ilink.transport", "butler.plan.mode", "butler.prompt_eval.corpus_bridge", "butler.prompt_eval.llm_rubric", ] strict = true [[tool.mypy.overrides]] # P5: *_ops.py passing mypy strict (scripts/p5_ops_strict_modules.py) module = [ "butler.agent_profiles_ops", "butler.agents_md_ops", "butler.butler_init_ops", "butler.cli.chat_cli_ops", "butler.cli.memory_cli_ops", "butler.cli.skills_registry_ops", "butler.cli.slash_dispatch_ops", "butler.config_ops", "butler.config_secrets_crypto_ops", "butler.config_secrets_ops", "butler.context_settings_ops", "butler.core.agent_loop_ops", "butler.core.agents_md_sections_ops", "butler.core.auto_review_ops", "butler.core.batch_sequence_guard_ops", "butler.core.compaction_checkpoint_ops", "butler.core.compaction_context_adapter_ops", "butler.core.compaction_status_ops", "butler.core.compaction_steer_bridge_ops", "butler.core.compaction_task_ops", "butler.core.context_budget_ops", "butler.core.context_pipeline_ops", "butler.core.context_transform_registry_ops", "butler.core.correction_intent_ops", "butler.core.design_md_sections_ops", "butler.core.dev_context_adapter_ops", "butler.core.dev_state_context_adapter_ops", "butler.core.events_sink_ops", "butler.core.exp_cache_ops", "butler.core.fact_extraction_ops", "butler.core.goal_loop_ops", "butler.core.hook_context_adapter_ops", "butler.core.hygiene_preflight_ops", "butler.core.instruction_walkup_ops", "butler.core.llm_retry_invoke_ops", "butler.core.llm_retry_ops", "butler.core.llm_retry_safe_ops", "butler.core.loop_middleware_ops", "butler.core.loop_plugins_ops", "butler.core.memory_context_adapter_ops", "butler.core.message_context_adapter_ops", "butler.core.metrics_sink_ops", "butler.core.mode_classifier_ops", "butler.core.model_context_ops", "butler.core.output_grounding_ops", "butler.core.parallel_tools_ops", "butler.core.pim_state_ops", "butler.core.post_commit_ops", "butler.core.post_compact_cleanup_ops", "butler.core.preemptive_compact_ops", "butler.core.preread_context_ops", "butler.core.prompt_renderer_ops", "butler.core.reactive_compact_ops", "butler.core.reasoning_trace_ops", "butler.core.reflection_closure_ops", "butler.core.reflexion_ephemeral_ops", "butler.core.reflexion_write_ops", "butler.core.remote_compact_ops", "butler.core.review_context_adapter_ops", "butler.core.schema_optimizer_ops", "butler.core.schema_recovery_ops", "butler.core.session_epoch_ops", "butler.core.session_hydration_ops", "butler.core.session_recall_intent_ops", "butler.core.session_todos_ops", "butler.core.session_tool_index_ops", "butler.core.session_transcript_ops", "butler.core.skill_tool_bridge_ops", "butler.core.steer_ops", "butler.core.streaming_tools_ops", "butler.core.system_reminder_ops", "butler.core.task_route_hints_ops", "butler.core.todo_continuation_ops", "butler.core.tool_batch_finalize_ops", "butler.core.tool_batch_runner_ops", "butler.core.tool_dispatch_doom_ops", "butler.core.tool_dispatch_ops", "butler.core.tool_error_policy_ops", "butler.core.tool_narrative_ops", "butler.core.tool_orchestrator_ops", "butler.core.tool_pair_repair_ops", "butler.core.tool_result_storage_ops", "butler.core.tool_retry_ops", "butler.core.tool_selector_ops", "butler.core.transcript_export_ops", "butler.core.transcript_search_ops", "butler.core.turn_summary_line_ops", "butler.core.two_phase_confirm_ops", "butler.dag_scheduler_ops", "butler.delegate.category_resolver_ops", "butler.delegate.policy_ops", "butler.delegate.subagent_permissions_ops", "butler.dev_engine.b9_delegate_gate_ops", "butler.dev_engine.b9_experience_retrieval_ops", "butler.dev_engine.b9_live_tuning_ops", "butler.dev_engine.b9_verify_utils_ops", "butler.dev_engine.code_search_ops", "butler.dev_engine.coding_knowledge_fixup_ops", "butler.dev_engine.coding_knowledge_ops", "butler.dev_engine.delegate_finalize_ops", "butler.dev_engine.delegate_init_ops", "butler.dev_engine.delegate_workspace_ops", "butler.dev_engine.dev_benchmark_ops", "butler.dev_engine.dev_context_ops", "butler.dev_engine.dev_loop_ops", "butler.dev_engine.dev_metrics_ops", "butler.dev_engine.dev_tools_ops", "butler.dev_engine.edit_ops", "butler.dev_engine.gentc_mutation_ops", "butler.dev_engine.llm_delegate_benchmark_ops", "butler.dev_engine.loop_plugin_ops", "butler.dev_engine.prod_delegate_bridge_ops", "butler.dev_engine.review_closure_ops", "butler.dev_engine.swebench_lite_ops", "butler.dev_engine.verify_ops", "butler.eval_integration.manager_ops", "butler.eval_integration.oss.deepeval_runner_ops", "butler.eval_integration.sinks.langfuse_sink_ops", "butler.eval_integration.suites_ops", "butler.execpolicy.engine_ops", "butler.experiments.ledger_ops", "butler.extensions.opencode_ops", "butler.gateway.bot_loop_guard_ops", "butler.gateway.command_registry_ops", "butler.gateway.commands.dev_handlers_ops", "butler.gateway.commands.dialog_commands_ops", "butler.gateway.commands.experience_commands_ops", "butler.gateway.commands.help_handlers_ops", "butler.gateway.commands.info_commands_ops", "butler.gateway.commands.lifecycle_commands_ops", "butler.gateway.commands.memory_handlers_ops", "butler.gateway.commands.permission_commands_ops", "butler.gateway.commands.project_commands_ops", "butler.gateway.commands.project_handlers_ops", "butler.gateway.commands.registry_handlers_ops", "butler.gateway.completion_notify_ops", "butler.gateway.completion_telemetry_ops", "butler.gateway.delegate_push_dedup_ops", "butler.gateway.gateway_transcript_ops", "butler.gateway.hooks_ops", "butler.gateway.inbound_idempotency_ops", "butler.gateway.inbound_media_ops", "butler.gateway.inbound_pipeline_ops", "butler.gateway.inbound_validate_ops", "butler.gateway.item_event_sink_ops", "butler.gateway.item_events_ops", "butler.gateway.locked_phases_ops", "butler.gateway.locked_turn_orchestrator_ops", "butler.gateway.media_telemetry_ops", "butler.gateway.message_handler_ops", "butler.gateway.message_pipelines_fail_closed_ops", "butler.gateway.message_queue_ops", "butler.gateway.minimax_vlm_ops", "butler.gateway.network_route_verify_runner_ops", "butler.gateway.outbound_bridge_ops", "butler.gateway.outbound_prefs_ops", "butler.gateway.owner_delegate_shortcuts_ops", "butler.gateway.owner_surface_ops", "butler.gateway.pii_scrub_ops", "butler.gateway.platforms.base_ops", "butler.gateway.platforms.wechat_ilink._utils_legacy_ops", "butler.gateway.platforms.wechat_ilink.adapter_inbound_ops", "butler.gateway.platforms.wechat_ilink.adapter_lifecycle_ops", "butler.gateway.platforms.wechat_ilink.adapter_media_ops", "butler.gateway.platforms.wechat_ilink.adapter_outbound_ops", "butler.gateway.platforms.wechat_ilink.connect_phases_ops", "butler.gateway.platforms.wechat_ilink.qr_phases_ops", "butler.gateway.platforms.wechat_ilink.send_phases_ops", "butler.gateway.queue_settings_ops", "butler.gateway.runner_ops", "butler.gateway.session_registry_ops", "butler.gateway.speech_stt_ops", "butler.gateway.task_milestone_ops", "butler.gateway.turn_post_pipeline_ops", "butler.gateway.vision_fallback_ops", "butler.gateway.wechat_scenario_sim_ops", "butler.gateway_settings_ops", "butler.hooks.loader_ops", "butler.hooks.runner_ops", "butler.hooks.telemetry_ops", "butler.human_gate_ops", "butler.mcp.async_runner_ops", "butler.mcp.client_http_ops", "butler.mcp.client_stdio_ops", "butler.mcp.config_ops", "butler.mcp.deferred_ops", "butler.mcp.extension_manifest_ops", "butler.mcp.extension_verify_ops", "butler.mcp.github_tool_aliases_ops", "butler.mcp.manager_ops", "butler.mcp.profiles_ops", "butler.mcp.registry_hook_ops", "butler.mcp.todoist_tool_aliases_ops", "butler.mcp.tools_engine_ops", "butler.mcp.tools_manifest_ops", "butler.mcp.turn_scrape_dedup_ops", "butler.memory.butler_memory_ops", "butler.memory.chunking_ops", "butler.memory.corpus_router_ops", "butler.memory.corrective_recall_ops", "butler.memory.document_ingest_ops", "butler.memory.embedding_ops", "butler.memory.experience_consolidation_ops", "butler.memory.experience_mining_ops", "butler.memory.facade_ops", "butler.memory.injection_llm_score_ops", "butler.memory.memory_benchmark_ops", "butler.memory.memory_metrics_ops", "butler.memory.metrics_persist_ops", "butler.memory.observer_queue_ops", "butler.memory.owner_experience_seed_ops", "butler.memory.prefetch_cache_ops", "butler.memory.prefetch_retrieval_metrics_ops", "butler.memory.project_memory_ops", "butler.memory.recall_layers_ops", "butler.memory.recall_ops", "butler.memory.reindex_ops", "butler.memory.retrieval_ranking_ops", "butler.memory.retrieval_telemetry_ops", "butler.memory.scope_diagnostics_ops", "butler.memory.search_result_ops", "butler.memory.semantic_health_ops", "butler.memory.semantic_index_ops", "butler.memory.semantic_project_ops", "butler.memory.transcript_memory_pipeline_ops", "butler.memory.vector_gc_ops", "butler.memory.vector_store_ops", "butler.memory_settings_ops", "butler.model_resolve_ops", "butler.ops.approval_diagnostics_ops", "butler.ops.assistant_health_ops", "butler.ops.b9_harness_audit_ops", "butler.ops.b9_lessons_ops", "butler.ops.b9_prod_weekly_ops", "butler.ops.boundary_observability_ops", "butler.ops.butler_inbox_ops", "butler.ops.compaction_audit_ops", "butler.ops.cost_tracker_ops", "butler.ops.degradation_registry_ops", "butler.ops.delegate_failure_b9_promote_ops", "butler.ops.delegate_failure_capture_ops", "butler.ops.delegate_judge_ops", "butler.ops.dev_eval_ops", "butler.ops.embedding_diagnostics_ops", "butler.ops.eval_actions_ops", "butler.ops.eval_bridge_ops", "butler.ops.eval_diagnostics_ops", "butler.ops.eval_experiment_ops", "butler.ops.eval_feedback_ops", "butler.ops.eval_regression_ops", "butler.ops.eval_turn_ops", "butler.ops.experience_selection_telemetry_ops", "butler.ops.experiment_diagnostics_ops", "butler.ops.g1_04_prod_evidence_ops", "butler.ops.harness_diagnostics_ops", "butler.ops.head_to_head_common_ops", "butler.ops.memory_eval_ops", "butler.ops.memory_recall_diagnostics_ops", "butler.ops.observation_diagnostics_ops", "butler.ops.onboard_ops", "butler.ops.openclaw_diagnostics_ops", "butler.ops.owner_brief_blocks_ops", "butler.ops.owner_feedback_ops", "butler.ops.owner_pmf_metrics_ops", "butler.ops.owner_quality_surface_ops", "butler.ops.owner_trust_surface_ops", "butler.ops.production_failure_experience_ops", "butler.ops.rag_diagnostics_ops", "butler.ops.registry_diagnostics_ops", "butler.ops.retry_buckets_ops", "butler.ops.secrets_contract_ops", "butler.ops.security_audit_ops", "butler.ops.snapshot_ops", "butler.ops.stack_diagnostics_ops", "butler.ops.swebench_live_eval_ops", "butler.ops.terminal_sandbox_diagnostics_ops", "butler.ops.tool_routing_ops", "butler.ops.wechat_corpus_eval_ops", "butler.ops.wechat_dataset_ops", "butler.orchestrator.loop_factory_ops", "butler.orchestrator.memory_bridge_ops", "butler.orchestrator.prompt_assembler_ops", "butler.orchestrator.templates_ops", "butler.permissions.doom_loop_ops", "butler.permissions.rules_fail_closed_ops", "butler.permissions.tool_boundary_registry_ops", "butler.plan.markdown_sync_ops", "butler.plan.mode_ops", "butler.project.manager_ops", "butler.project.preflight_ops", "butler.project.worktree_ops", "butler.prompt_eval.corpus_bridge_ops", "butler.prompt_eval.llm_rubric_ops", "butler.provider_presets_ops", "butler.registry.hub_manifest_ops", "butler.registry.install_scan_ops", "butler.registry.marketplace_compat_ops", "butler.registry.mcp_catalog_ops", "butler.registry.mcp_catalog_remote_ops", "butler.registry.mcp_install_ops", "butler.registry.mcp_merge_ops", "butler.registry.mcp_project_tools_ops", "butler.registry.registry_paths_ops", "butler.registry.skill_service_ops", "butler.registry.skill_sources.bundled_ops", "butler.registry.skill_sources.clawhub_ops", "butler.registry.skill_sources.lobehub_ops", "butler.registry.skill_sources.marketplace_ops", "butler.registry.skill_sources.url_ops", "butler.registry.skills_project_sync_ops", "butler.registry.url_safety_ops", "butler.repo_paths", "butler.report.format_ops", "butler.report.generator_ops", "butler.runtime.async_delegate_ops", "butler.runtime.cc_bridge_ops", "butler.runtime.delegate_job_finalize_ops", "butler.runtime.delegate_progress_ops", "butler.runtime.delegate_registry_ops", "butler.runtime.diagnostics_ops", "butler.runtime.failure_tracker_ops", "butler.runtime.notify_ops", "butler.runtime.service_ops", "butler.session.lifecycle_ops", "butler.session.memory_prefetch_ops", "butler.session.new_session_ops", "butler.session.post_session_extract_ops", "butler.session.post_session_guard_ops", "butler.session.post_session_layered_ops", "butler.session.post_session_ops", "butler.skills.fusion_wiring_ops", "butler.skills.injection_policy_ops", "butler.skills.learn_ops", "butler.skills.manager_ops", "butler.skills.router_ops", "butler.skills.similarity_ops", "butler.skills.write_approval_ops", "butler.task_orchestrator_ops", "butler.tool_guardrails_ops", "butler.tools.audit_persist_ops", "butler.tools.builtin_impl_ops", "butler.tools.builtin_register_ops", "butler.tools.butlerignore_ops", "butler.tools.data_query_ops", "butler.tools.delegate_impl_ops", "butler.tools.delegate_prepare_ops", "butler.tools.delegate_record_ops", "butler.tools.delegate_report_ops", "butler.tools.delegate_role_guard_ops", "butler.tools.delegate_run_ops", "butler.tools.delegate_subagent_ops", "butler.tools.delegate_yield_tools_ops", "butler.tools.document_reader_ops", "butler.tools.execute_code_ops", "butler.tools.file_io_ops", "butler.tools.knowledge_search_ops", "butler.tools.mcp_self_service_ops", "butler.tools.memory_tools_ops", "butler.tools.multimodal_tools_ops", "butler.tools.network_route_verify_ops", "butler.tools.network_search_policy_ops", "butler.tools.orthogonality_lint_ops", "butler.tools.path_safety_ops", "butler.tools.project_todos_ops", "butler.tools.project_tools_ops", "butler.tools.registry_invoke_ops", "butler.tools.registry_tools_ops", "butler.tools.runtime_tools_ops", "butler.tools.session_todos_tools_ops", "butler.tools.tenant_store_ops", "butler.tools.terminal_approval_ops", "butler.tools.terminal_danger_ops", "butler.tools.terminal_impl_ops", "butler.tools.terminal_pattern_approval_ops", "butler.tools.tool_audit_ops", "butler.tools.tool_implicit_context_ops", "butler.tools.web_fetch_ops", "butler.tools.web_search_ops", "butler.transport.auxiliary_client_ops", "butler.transport.fusion_client_ops", "butler.transport.interruptible_client_ops", "butler.transport.llm_client_ops", "butler.transport.reasoning_replay_ops", "butler.transport.stream_probe_ops", "butler.transport.streaming_signal_ops", "butler.transport.tool_wire_ops", "butler.workflow_step_runner_ops", "butler.workflows.callbacks_ops", "butler.workflows.runner_ops", "butler.workflows.validate_ops", "butler.workflows.workflow_run_snapshot_ops", ] strict = true [tool.coverage.run] source = ["butler"] omit = [ "butler/tools/builtin_impl.py", ] [tool.coverage.report] show_missing = true skip_covered = true fail_under = 55 exclude_lines = [ "pragma: no cover", "if TYPE_CHECKING:", "if __name__ ==", "@overload", ]