pyproject.toml
Rama main · réplica de lectura del repositorio original.
[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",
]