Skip to content

Refactor toolset enabling - #1830

Merged
moshemorad merged 18 commits into
masterfrom
claude/fix-missing-config-toolset-TgjCb
Mar 26, 2026
Merged

moshemorad merged 18 commits into
masterfrom
claude/fix-missing-config-toolset-TgjCb

Conversation

@aantn

@aantn aantn commented Mar 22, 2026 •

Copy link
Copy Markdown
Collaborator

Refactoring, not supposed to change behaviour other than edge case toolset has is_default but was explicitly disabled by user setting enabled: false in the config. We want to respect user intent and disable it which should now be the case after this PR.

Note: this also removes is_default which was not actually used to determine what is enabled by default or not (helm values are used for that + passing enabled=true in the constructor)

https://claude.ai/code/session_01U2xED3Qq15dKJKNkHBcXjq

Summary by CodeRabbit

  • Bug Fixes

    • Toolsets with required configuration are now reliably reported as missing configuration, regardless of enablement/default state.
  • Behavior Changes

    • Toolsets are no longer implicitly designated as "default" in several places; enablement is now controlled explicitly.
  • Tests

    • Updated tests to reflect the new missing-configuration semantics and default-designation behavior.
  • Chores

    • Removed the checklist item about the default-flag from the PR template.

Remove the enabled/is_default policy guard from missing_config so it
only reports whether required configuration is absent.  Callers
(toolset_manager.py) already handle the policy decision of what to do
with that information.  Also simplify the tail to `return self.config
is None`.

https://claude.ai/code/session_01U2xED3Qq15dKJKNkHBcXjq
Signed-off-by: Claude <noreply@anthropic.com>

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Claude Code Review

This repository is configured for manual code reviews. Comment @claude review to trigger a review.

@github-actions

github-actions Bot commented Mar 22, 2026 •

Copy link
Copy Markdown
Contributor

📂 Previous Runs

📜 #5 · Run @ __52245cd__ (#23423529277) — Mar 23, 06:00 UTC

✅ Results of HolmesGPT evals

Automatically triggered by commit 52245cd on branch claude/fix-missing-config-toolset-TgjCb

View workflow logs

Results of HolmesGPT evals

  • ask_holmes: 11/11 test cases were successful, 0 regressions
Status Test case Time Turns Tools Cost Total tokens Input Max input Output Max output Cached Non-cached Reasoning Compactions
✅ 09_crashpod 28.5s 5 10 $0.2406 104,870 102,820 23,270 2,050 861 78,635 24,185 — —
✅ 101_loki_historical_logs_pod_deleted 48.7s 8 15 $0.3448 188,726 185,345 28,212 3,381 733 155,937 29,408 — —
✅ 112_find_pvcs_by_uuid 20.8s 5 4 $0.2030 97,897 96,784 22,043 1,113 290 74,728 22,056 — —
✅ 12_job_crashing 27.2s 5 12 $0.2503 111,468 109,482 24,693 1,986 595 83,913 25,569 — —
✅ 176_network_policy_blocking_traffic_no_runbooks 38.0s 6 17 $0.3098 141,493 138,563 27,510 2,930 812 109,023 29,540 — —
✅ 227_count_configmaps_per_namespace[0] 20.1s 5 9 $0.2055 95,683 94,416 21,038 1,267 578 72,130 22,286 — —
✅ 243_pod_names_contain_service 28.1s 5 9 $0.2285 101,363 99,408 22,359 1,955 580 76,754 22,654 — —
✅ 24_misconfigured_pvc 29.0s 5 13 $0.2479 104,518 102,187 23,072 2,331 820 77,805 24,382 — —
✅ 43_current_datetime_from_prompt 4.1s 1 — $0.1099 17,204 17,078 17,078 126 126 0 17,078 — —
✅ 51_logs_summarize_errors 18.0s 4 5 $0.1886 78,418 77,342 21,385 1,076 326 55,945 21,397 — —
✅ 61_exact_match_counting 9.8s 3 3 $0.1399 53,314 52,934 18,070 380 233 34,853 18,081 — —
Total 24.7s avg 4.7 avg 9.7 avg $2.4688 1,094,954 1,076,359 28,212 18,595 861 819,723 256,636 — —

Benchmark comparison unavailable: No ci-benchmark experiments found

Benchmark Comparison Details

Baseline: latest ci-benchmark experiment on master

Status: No ci-benchmark experiments found

Comparison indicators:

  • ±0% — diff under 10% (within noise threshold)
  • ↑N%/↓N% — diff 10-25%
  • ↑N%/↓N% — diff over 25% (significant)
📜 #4 · Run @ __a3cab75__ (#23415235105) — Mar 22, 23:42 UTC

✅ Results of HolmesGPT evals

Automatically triggered by commit a3cab75 on branch claude/fix-missing-config-toolset-TgjCb

View workflow logs

Results of HolmesGPT evals

  • ask_holmes: 11/11 test cases were successful, 0 regressions
Status Test case Time Turns Tools Cost Total tokens Input Max input Output Max output Cached Non-cached Reasoning Compactions
✅ 09_crashpod 26.1s 4 9 $0.2250 82,984 81,047 23,208 1,937 973 57,257 23,790 — —
✅ 101_loki_historical_logs_pod_deleted 52.8s 8 16 $0.3445 186,269 182,757 27,357 3,512 712 153,610 29,147 — —
✅ 112_find_pvcs_by_uuid 26.1s 6 5 $0.2278 121,623 120,159 22,799 1,464 333 97,346 22,813 — —
✅ 12_job_crashing 31.7s 6 14 $0.2666 136,653 134,497 25,182 2,156 573 109,164 25,333 — —
✅ 176_network_policy_blocking_traffic_no_runbooks 43.2s 7 15 $0.3219 161,774 159,035 27,142 2,739 628 127,920 31,115 — —
✅ 227_count_configmaps_per_namespace[0] 24.1s 6 10 $0.2152 114,459 112,932 20,791 1,527 519 91,920 21,012 — —
✅ 243_pod_names_contain_service 24.6s 5 7 $0.2091 98,822 97,366 21,323 1,456 457 75,737 21,629 — —
✅ 24_misconfigured_pvc 32.5s 6 14 $0.2616 124,484 122,082 23,630 2,402 716 97,420 24,662 — —
✅ 43_current_datetime_from_prompt 4.1s 1 — $0.1097 17,196 17,078 17,078 118 118 0 17,078 — —
✅ 51_logs_summarize_errors 19.4s 4 5 $0.1915 78,776 77,624 21,539 1,152 397 56,073 21,551 — —
✅ 61_exact_match_counting 10.8s 3 3 $0.1396 53,281 52,911 18,058 370 223 34,842 18,069 — —
Total 26.9s avg 5.1 avg 9.8 avg $2.5126 1,176,321 1,157,488 27,357 18,833 973 901,289 256,199 — —

Benchmark comparison unavailable: No ci-benchmark experiments found

Benchmark Comparison Details

Baseline: latest ci-benchmark experiment on master

Status: No ci-benchmark experiments found

Comparison indicators:

  • ±0% — diff under 10% (within noise threshold)
  • ↑N%/↓N% — diff 10-25%
  • ↑N%/↓N% — diff over 25% (significant)
📜 #3 · Run @ __3e9bf55__ (#23414906790) — Mar 22, 23:24 UTC

✅ Results of HolmesGPT evals

Automatically triggered by commit 3e9bf55 on branch claude/fix-missing-config-toolset-TgjCb

View workflow logs

Results of HolmesGPT evals

  • ask_holmes: 11/11 test cases were successful, 0 regressions
Status Test case Time Turns Tools Cost Total tokens Input Max input Output Max output Cached Non-cached Reasoning Compactions
✅ 09_crashpod 28.1s 5 11 $0.2520 106,337 104,265 24,161 2,072 866 78,073 26,192 — —
✅ 101_loki_historical_logs_pod_deleted 48.9s 7 16 $0.3262 164,156 160,848 26,677 3,308 1,074 132,030 28,818 — —
✅ 112_find_pvcs_by_uuid 14.1s 3 3 $0.1742 60,296 59,449 21,432 847 453 38,006 21,443 — —
✅ 12_job_crashing 30.5s 6 13 $0.2786 136,893 134,814 25,293 2,079 595 106,457 28,357 — —
✅ 176_network_policy_blocking_traffic_no_runbooks 41.8s 6 15 $0.3001 141,050 138,062 26,959 2,988 864 110,801 27,261 — —
✅ 227_count_configmaps_per_namespace[0] 21.3s 5 9 $0.2006 95,623 94,381 21,024 1,242 583 73,029 21,352 — —
✅ 243_pod_names_contain_service 27.9s 6 8 $0.2284 117,977 116,257 21,895 1,720 429 94,054 22,203 — —
✅ 24_misconfigured_pvc 27.7s 5 13 $0.2430 104,018 101,860 23,211 2,158 562 77,604 24,256 — —
✅ 43_current_datetime_from_prompt 3.8s 1 — $0.1102 17,216 17,078 17,078 138 138 0 17,078 — —
✅ 51_logs_summarize_errors 19.3s 4 5 $0.1874 77,758 76,639 21,049 1,119 366 55,578 21,061 — —
✅ 61_exact_match_counting 10.0s 3 3 $0.1396 53,273 52,903 18,055 370 223 34,837 18,066 — —
Total 24.9s avg 4.6 avg 9.6 avg $2.4402 1,074,597 1,056,556 26,959 18,041 1,074 800,469 256,087 — —

Benchmark comparison unavailable: No ci-benchmark experiments found

Benchmark Comparison Details

Baseline: latest ci-benchmark experiment on master

Status: No ci-benchmark experiments found

Comparison indicators:

  • ±0% — diff under 10% (within noise threshold)
  • ↑N%/↓N% — diff 10-25%
  • ↑N%/↓N% — diff over 25% (significant)
📜 #2 · Run @ __0357e3b__ (#23413966564) — Mar 22, 22:31 UTC

✅ Results of HolmesGPT evals

Automatically triggered by commit 0357e3b on branch claude/fix-missing-config-toolset-TgjCb

View workflow logs

Results of HolmesGPT evals

  • ask_holmes: 11/11 test cases were successful, 0 regressions
Status Test case Time Turns Tools Cost Total tokens Input Max input Output Max output Cached Non-cached Reasoning Compactions
✅ 09_crashpod 26.6s 5 9 $0.2380 104,475 102,638 23,239 1,837 567 77,814 24,824 — —
✅ 101_loki_historical_logs_pod_deleted 43.0s 7 13 $0.3093 154,475 151,741 27,096 2,734 506 122,591 29,150 — —
✅ 112_find_pvcs_by_uuid 15.5s 3 3 $0.1794 60,985 60,004 21,707 981 581 38,286 21,718 — —
✅ 12_job_crashing 32.8s 6 13 $0.2749 136,910 134,630 25,231 2,280 580 108,166 26,464 — —
✅ 176_network_policy_blocking_traffic_no_runbooks 38.2s 7 13 $0.2969 155,939 153,351 25,998 2,588 557 126,002 27,349 — —
✅ 227_count_configmaps_per_namespace[0] 21.0s 5 9 $0.2013 95,703 94,439 21,047 1,264 585 73,063 21,376 — —
✅ 243_pod_names_contain_service 25.9s 5 8 $0.2178 99,331 97,700 21,770 1,631 536 75,261 22,439 — —
✅ 24_misconfigured_pvc 29.6s 5 12 $0.2433 103,600 101,522 23,109 2,078 664 76,698 24,824 — —
✅ 43_current_datetime_from_prompt 4.7s 1 — $0.1099 17,206 17,078 17,078 128 128 0 17,078 — —
✅ 51_logs_summarize_errors 19.1s 4 5 $0.1890 78,367 77,268 21,364 1,099 341 55,892 21,376 — —
✅ 61_exact_match_counting 10.5s 3 3 $0.1399 53,318 52,938 18,073 380 233 34,854 18,084 — —
Total 24.3s avg 4.6 avg 8.8 avg $2.3998 1,060,309 1,043,309 27,096 17,000 664 788,627 254,682 — —

Benchmark comparison unavailable: No ci-benchmark experiments found

Benchmark Comparison Details

Baseline: latest ci-benchmark experiment on master

Status: No ci-benchmark experiments found

Comparison indicators:

  • ±0% — diff under 10% (within noise threshold)
  • ↑N%/↓N% — diff 10-25%
  • ↑N%/↓N% — diff over 25% (significant)
📜 #1 · Run @ __0aca0c3__ (#23413737768) — Mar 22, 22:17 UTC

⚠️ Eval Results (with failures)

Automatically triggered by commit 0aca0c3 on branch claude/fix-missing-config-toolset-TgjCb

View workflow logs

Results of HolmesGPT evals

  • ask_holmes: 0/11 test cases were successful, 11 regressions
Status Test case Time Turns Tools Cost Total tokens Input Max input Output Max output Cached Non-cached Reasoning Compactions
❌ 09_crashpod — — — — — — — — — — — — —
❌ 101_loki_historical_logs_pod_deleted — — — — — — — — — — — — —
❌ 112_find_pvcs_by_uuid — — — — — — — — — — — — —
❌ 12_job_crashing — — — — — — — — — — — — —
❌ 176_network_policy_blocking_traffic_no_runbooks — — — — — — — — — — — — —
❌ 227_count_configmaps_per_namespace[0] — — — — — — — — — — — — —
❌ 243_pod_names_contain_service — — — — — — — — — — — — —
❌ 24_misconfigured_pvc — — — — — — — — — — — — —
❌ 43_current_datetime_from_prompt — — — — — — — — — — — — —
❌ 51_logs_summarize_errors — — — — — — — — — — — — —
❌ 61_exact_match_counting — — — — — — — — — — — — —
Total — avg — avg — avg — — — — — — — — — —

Benchmark comparison unavailable: No ci-benchmark experiments found

Benchmark Comparison Details

Baseline: latest ci-benchmark experiment on master

Status: No ci-benchmark experiments found

Comparison indicators:

  • ±0% — diff under 10% (within noise threshold)
  • ↑N%/↓N% — diff 10-25%
  • ↑N%/↓N% — diff over 25% (significant)

⚠️ 11 Failures Detected


✅ Results of HolmesGPT evals

Automatically triggered by commit 0937ccf on branch claude/fix-missing-config-toolset-TgjCb

View workflow logs

Results of HolmesGPT evals

  • ask_holmes: 11/11 test cases were successful, 0 regressions
Status Test case Time Turns Tools Cost Total tokens Input Max input Output Max output Cached Non-cached Reasoning Compactions
✅ 09_crashpod 44.7s 4 9 $0.2252 82,913 80,963 23,190 1,950 997 57,187 23,776 — —
✅ 101_loki_historical_logs_pod_deleted 86.5s 9 17 $0.3566 210,028 206,407 27,755 3,621 559 177,931 28,476 — —
✅ 112_find_pvcs_by_uuid 27.3s 3 4 $0.2160 67,064 65,952 24,698 1,112 667 38,308 27,644 — —
✅ 12_job_crashing 48.6s 6 13 $0.2792 137,902 135,586 25,490 2,316 671 108,559 27,027 — —
✅ 176_network_policy_blocking_traffic_no_runbooks 55.7s 7 12 $0.2922 154,262 151,649 25,671 2,613 606 125,202 26,447 — —
✅ 227_count_configmaps_per_namespace[0] 38.4s 5 9 $0.2010 95,672 94,418 21,041 1,254 585 73,050 21,368 — —
✅ 243_pod_names_contain_service 46.7s 5 10 $0.2362 103,343 101,177 22,630 2,166 597 78,248 22,929 — —
✅ 24_misconfigured_pvc 64.8s 5 14 $0.2548 107,406 104,974 23,851 2,432 779 80,148 24,826 — —
✅ 43_current_datetime_from_prompt 7.1s 1 — $0.1098 17,202 17,078 17,078 124 124 0 17,078 — —
✅ 51_logs_summarize_errors 39.8s 4 5 $0.1882 78,302 77,223 21,314 1,079 328 55,897 21,326 — —
✅ 61_exact_match_counting 15.1s 2 1 $0.1281 35,067 34,684 17,597 383 314 17,077 17,607 — —
Total 43.1s avg 4.6 avg 9.4 avg $2.4874 1,089,161 1,070,111 27,755 19,050 997 811,607 258,504 — —

Benchmark comparison unavailable: No ci-benchmark experiments found

Benchmark Comparison Details

Baseline: latest ci-benchmark experiment on master

Status: No ci-benchmark experiments found

Comparison indicators:

  • ±0% — diff under 10% (within noise threshold)
  • ↑N%/↓N% — diff 10-25%
  • ↑N%/↓N% — diff over 25% (significant)
📖 Legend
Icon Meaning
✅ The test was successful
➖ The test was skipped
⚠️ The test failed but is known to be flaky or known to fail
🚧 The test had a setup failure (not a code regression)
🔧 The test failed due to mock data issues (not a code regression)
🚫 The test was throttled by API rate limits/overload
❌ The test failed and should be fixed before merging the PR
🔄 Re-run evals manually

⚠️ Warning: /eval comments always run using the workflow from master, not from this PR branch. If you modified the GitHub Action (e.g., added secrets or env vars), those changes won't take effect.

To test workflow changes, use the GitHub CLI or Actions UI instead:

gh workflow run eval-regression.yaml --repo HolmesGPT/holmesgpt --ref claude/fix-missing-config-toolset-TgjCb -f markers=regression -f filter=

Option 1: Comment on this PR with /eval:

/eval
tags: regression

Or with more options (one per line):

/eval
model: gpt-4o
tags: regression
id: 09_crashpod
iterations: 5

Run evals on a different branch (e.g., master) for comparison:

/eval
branch: master
tags: regression
Option Description
model Model(s) to test (default: same as automatic runs)
tags Pytest tags / markers (no default - runs all tests!)
id Eval ID / pytest -k filter (use /list to see valid eval names)
iterations Number of runs, max 10
branch Run evals on a different branch (for cross-branch comparison)

Quick re-run: Use /rerun to re-run the most recent /eval on this PR with the same parameters.

Option 2: Trigger via GitHub Actions UI → "Run workflow"

Option 3: Add PR labels to include extra evals (applies to both automatic runs and /eval comments):

Label Effect
evals-tag-<name> Run tests with tag <name> alongside regression
evals-id-<name> Run a specific eval by test ID
evals-model-<name> Override the model (use model list name, e.g. sonnet-4.5)

Examples: evals-tag-easy, evals-id-09_crashpod, evals-model-sonnet-4.5

🏷️ Valid tags

benchmark, chain-of-causation, compaction, confluence, context_window, coralogix, counting, database, datadog, datetime, db-connectors, easy, elasticsearch, embeds, fast, frontend, grafana, hard, images, integration, kafka, kubernetes, leaked-information, logs, loki, mcp, medium, metrics, network, newrelic, no-cicd, numerical, one-test, port-forward, prometheus, question-answer, regression, runbooks, slackbot, storage, toolset-limitation, traces, transparency

🤖 Valid models

deepseek-chat, deepseek-r1-reasoner, deepseek-reasoner, deepseek-v3.2-chat, gemini-3-flash-preview, gemini-3-pro-preview, gemini-3.1-pro-preview, gpt-4.1, gpt-5.2-high-reasoning, gpt-5.3-codex, gpt-5.4, haiku-4.5, kimi-2.5, kimi-2.5-openrouter, opus-4.5, opus-4.6, qwen-next-80B-instruct, qwen-next-80B-thinking, sonnet-4.5, sonnet-4.6


Commands: /eval · /rerun · /list

CLI: gh workflow run eval-regression.yaml --repo HolmesGPT/holmesgpt --ref claude/fix-missing-config-toolset-TgjCb -f markers=regression -f filter=

@github-actions

github-actions Bot commented Mar 22, 2026 •

Copy link
Copy Markdown
Contributor

✅ Docker images ready for 21ddffc4 (built in 1m 0s)

⚠️ Warning: does not support ARM (ARM images are built on release only - not on every PR)

Use these tags to pull the images for testing.

📋 Copy commands

⚠️ Temporary images are deleted after 30 days. Copy to a permanent registry before using them:

gcloud auth configure-docker us-central1-docker.pkg.dev
docker pull us-central1-docker.pkg.dev/robusta-development/temporary-builds/holmes:21ddffc4
docker tag us-central1-docker.pkg.dev/robusta-development/temporary-builds/holmes:21ddffc4 me-west1-docker.pkg.dev/robusta-development/development/holmes-dev:21ddffc4
docker push me-west1-docker.pkg.dev/robusta-development/development/holmes-dev:21ddffc4
docker pull us-central1-docker.pkg.dev/robusta-development/temporary-builds/holmes-operator:21ddffc4
docker tag us-central1-docker.pkg.dev/robusta-development/temporary-builds/holmes-operator:21ddffc4 me-west1-docker.pkg.dev/robusta-development/development/holmes-operator-dev:21ddffc4
docker push me-west1-docker.pkg.dev/robusta-development/development/holmes-operator-dev:21ddffc4

Patch Helm values in one line (choose the chart you use):

HolmesGPT chart:

helm upgrade --install holmesgpt ./helm/holmes \
  --set registry=me-west1-docker.pkg.dev/robusta-development/development \
  --set image=holmes-dev:21ddffc4 \
  --set operator.registry=me-west1-docker.pkg.dev/robusta-development/development \
  --set operator.image=holmes-operator-dev:21ddffc4

Robusta wrapper chart:

helm upgrade --install robusta robusta/robusta \
  --reuse-values \
  --set holmes.registry=me-west1-docker.pkg.dev/robusta-development/development \
  --set holmes.image=holmes-dev:21ddffc4 \
  --set holmes.operator.registry=me-west1-docker.pkg.dev/robusta-development/development \
  --set holmes.operator.image=holmes-operator-dev:21ddffc4

@coderabbitai

coderabbitai Bot commented Mar 22, 2026 •

Copy link
Copy Markdown
Contributor

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Removed the Toolset.is_default field and decoupled default/enablement from config-missing detection; Toolset.missing_config now returns True only when config classes exist, at least one requires fields, config is required, and self.config is None.

Changes

Cohort / File(s) Summary
Core Toolset logic
holmes/core/tools.py
Removed public Toolset.is_default field; simplified Toolset.missing_config to ignore enabled/default state and only check for required config classes/fields and self.config is None.
Plugin toolset constructors
holmes/plugins/toolsets/bash/bash_toolset.py, holmes/plugins/toolsets/connectivity_check.py, holmes/plugins/toolsets/internet/..., holmes/plugins/toolsets/internet/notion.py, holmes/plugins/toolsets/investigator/core_investigation.py, holmes/plugins/toolsets/kubernetes_logs.py, holmes/plugins/toolsets/robusta/robusta.py, holmes/plugins/toolsets/runbook/runbook_fetcher.py
Removed passing/forwarding of is_default (explicit is_default=True/False removed); some toolsets set enabled=True on instances where previously is_default implied enablement. No other behavioral changes.
Tests
tests/test_toolset_auto_enable.py, tests/plugins/toolsets/test_core_investigation.py
Updated test helper signatures and assertions to remove reliance on is_default; adjusted expectations for missing_config to be independent of enabled/default flags.
PR template
.github/PULL_REQUEST_TEMPLATE/toolset.md
Removed checklist item referencing the is_default flag.
Test metadata
tests/llm/fixtures/.../test_case.yaml
Added regression tag to test case metadata.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested labels

evals-label-logs

Suggested reviewers

  • arikalon1
  • moshemorad
  • Avi-Robusta
🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 37.50% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main change: removing the is_default field and refactoring toolset enablement logic throughout the codebase.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@netlify

netlify Bot commented Mar 22, 2026 •

Copy link
Copy Markdown

✅ Deploy Preview for holmes-docs ready!

Name Link
🔨 Latest commit 9d0b40d
🔍 Latest deploy log https://app.netlify.com/projects/holmes-docs/deploys/69c5621defdab00008e5cc90
😎 Deploy Preview https://deploy-preview-1830--holmes-docs.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@github-actions

github-actions Bot commented Mar 22, 2026 •

Copy link
Copy Markdown
Contributor

🔬 CLI Performance Benchmark

🟡 Startup Time (no LLM)

Measures holmes version execution time (imports + initialization)

Metric PR Master Change
Cold Start 11.53s 11.63s -0.9%
Warm Mean 5.34s 5.37s -0.5%
Warm Min 5.30s 5.36s
Warm Max 5.42s 5.38s

🟡 Full CLI with LLM

Measures holmes ask execution time (OpenRouter + Haiku 4.5)

Metric PR Master Change
Cold Start 24.51s 23.19s +5.7%
Warm Mean 8.89s 8.46s +5.1%
Warm Min 8.02s 8.03s
Warm Max 10.65s 9.37s

PR: 21ddffc4 | Master: 26950257 | Iterations: 5

@aantn

aantn commented Mar 22, 2026

Copy link
Copy Markdown
Collaborator Author

@claude review

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Code review skipped — your organization's overage spend limit has been reached.

Code review is billed via overage credits. To resume reviews, an organization admin can raise the monthly limit in Settings → Usage.

Once credits are available, comment @claude review on this pull request to trigger a review.

@aantn

aantn commented Mar 22, 2026

Copy link
Copy Markdown
Collaborator Author

@claude review

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The logic change is clean and well-tested, but this is a behavioral change to a core Toolset property — toolsets that are enabled=True but have no config will now report missing_config=True, which could affect callers that rely on the old short-circuit. Worth a quick human glance before merging.

Extended reasoning...

Overview

This PR modifies Toolset.missing_config in holmes/core/tools.py by removing the early-return if self.enabled or self.is_default: return False guard, making the property a pure fact-check. Tests in tests/test_toolset_auto_enable.py are updated accordingly.

Security risks

No security-sensitive code is touched. No auth, crypto, or permission changes.

Level of scrutiny

Despite being described as a refactor, this is a behavioral change: previously an enabled=True toolset with required config classes but no config would return missing_config=False; after this PR it returns True. Any caller that gates behavior on missing_config (e.g., to decide whether to show a setup warning or skip a toolset) may now behave differently for toolsets that are enabled but have missing config. The diff is small and the test coverage is solid, but the caller surface for missing_config should be verified before merging.

Other factors

The nit about is_default becoming dead code is valid but low impact — the field still serializes via model_dump_json() and no runtime regression occurs today. Evals show 9/10 passing with 1 setup failure (not a regression). CodeRabbit raised no actionable concerns. The PR is well-scoped and the intent is clear, but a human should confirm the behavioral change for enabled=True toolsets is intentional and that all callers of missing_config have been audited.

Comment thread holmes/core/tools.py
is_default was never read to make runtime decisions — toolsets are
enabled either explicitly (enabled=True in constructor) or via the
Helm chart config. Remove the field, all setter sites, and the
associated test and PR template checklist item.

https://claude.ai/code/session_01U2xED3Qq15dKJKNkHBcXjq
Signed-off-by: Claude <noreply@anthropic.com>
@aantn aantn changed the title Refactor missing_config to be a pure fact-check property Refactor toolset enabling Mar 22, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
tests/test_toolset_auto_enable.py (1)

74-77: Please add a caller-level auto-enable test for this refactor.

This locks in the property contract, but the PR objective is about caller behavior after the refactor—especially the explicit enabled: false path. A ToolsetManager/auto-enable test with a required-config toolset would catch regressions that this unit test will miss.

As per coding guidelines, "Live execution is enabled by default in tests - ensure tests match real-world behavior."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/test_toolset_auto_enable.py` around lines 74 - 77, Add a new
caller-level test that registers a required-config toolset with the
ToolsetManager and verifies the manager auto-enables it even when the toolset
was constructed with enabled=False: use _make_toolset(enabled=False,
config_classes=[RequiredFieldConfig]) to create the toolset, register it with
ToolsetManager, invoke the public caller-level entrypoint on ToolsetManager that
triggers auto-enable (the manager method used by callers to load/enable
toolsets), then assert the toolset is now enabled and still reports
missing_config=True; this locks in caller behavior after the refactor.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@tests/test_toolset_auto_enable.py`:
- Around line 74-77: Add a new caller-level test that registers a
required-config toolset with the ToolsetManager and verifies the manager
auto-enables it even when the toolset was constructed with enabled=False: use
_make_toolset(enabled=False, config_classes=[RequiredFieldConfig]) to create the
toolset, register it with ToolsetManager, invoke the public caller-level
entrypoint on ToolsetManager that triggers auto-enable (the manager method used
by callers to load/enable toolsets), then assert the toolset is now enabled and
still reports missing_config=True; this locks in caller behavior after the
refactor.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 30e0cfcf-0513-4f05-bea0-f9084debb6de

📥 Commits

Reviewing files that changed from the base of the PR and between c5b2b60 and 7f883e6.

📒 Files selected for processing (12)
  • .github/PULL_REQUEST_TEMPLATE/toolset.md
  • holmes/core/tools.py
  • holmes/plugins/toolsets/bash/bash_toolset.py
  • holmes/plugins/toolsets/connectivity_check.py
  • holmes/plugins/toolsets/internet/internet.py
  • holmes/plugins/toolsets/internet/notion.py
  • holmes/plugins/toolsets/investigator/core_investigation.py
  • holmes/plugins/toolsets/kubernetes_logs.py
  • holmes/plugins/toolsets/robusta/robusta.py
  • holmes/plugins/toolsets/runbook/runbook_fetcher.py
  • tests/plugins/toolsets/test_core_investigation.py
  • tests/test_toolset_auto_enable.py
💤 Files with no reviewable changes (10)
  • holmes/plugins/toolsets/investigator/core_investigation.py
  • holmes/plugins/toolsets/bash/bash_toolset.py
  • holmes/plugins/toolsets/robusta/robusta.py
  • .github/PULL_REQUEST_TEMPLATE/toolset.md
  • tests/plugins/toolsets/test_core_investigation.py
  • holmes/plugins/toolsets/kubernetes_logs.py
  • holmes/plugins/toolsets/connectivity_check.py
  • holmes/plugins/toolsets/internet/notion.py
  • holmes/plugins/toolsets/runbook/runbook_fetcher.py
  • holmes/plugins/toolsets/internet/internet.py

These two toolsets were relying on the now-removed is_default field to
be picked up in server mode. Without explicit enabled=True, they would
be silently disabled when enable_all_toolsets=False (server flow).

https://claude.ai/code/session_01U2xED3Qq15dKJKNkHBcXjq
Signed-off-by: Claude <noreply@anthropic.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
holmes/plugins/toolsets/internet/internet.py (1)

272-286: ⚠️ Potential issue | 🔴 Critical

enabled=True causes constructor crash due to signature mismatch.

InternetToolset.__init__ passes enabled=True, but InternetBaseToolset.__init__ does not accept enabled. This will fail at runtime with TypeError: unexpected keyword argument 'enabled'.

Proposed fix

Add enabled parameter to InternetBaseToolset.__init__:

 class InternetBaseToolset(Toolset):
     def __init__(
         self,
         name: str,
         description: str,
         icon_url: str,
         tools: list[Tool],
         tags: List[ToolsetTag],
         docs_url: Optional[str] = None,
+        enabled: bool = False,
     ):
         super().__init__(
             name=name,
             description=description,
             icon_url=icon_url,
             prerequisites=[
                 CallablePrerequisite(callable=self.prerequisites_callable),
             ],
             tools=tools,
             tags=tags,
             docs_url=docs_url,
+            enabled=enabled,
         )
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@holmes/plugins/toolsets/internet/internet.py` around lines 272 - 286, The
crash is caused by InternetToolset.__init__ passing enabled=True to
InternetBaseToolset.__init__, which doesn't accept that keyword; fix by adding
an enabled: bool = True parameter to InternetBaseToolset.__init__ (and propagate
it to its super().__init__ or otherwise handle/store it) so
InternetToolset.__init__ can pass enabled through without raising TypeError;
update InternetBaseToolset.__init__ signature and forwarding logic accordingly.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In `@holmes/plugins/toolsets/internet/internet.py`:
- Around line 272-286: The crash is caused by InternetToolset.__init__ passing
enabled=True to InternetBaseToolset.__init__, which doesn't accept that keyword;
fix by adding an enabled: bool = True parameter to InternetBaseToolset.__init__
(and propagate it to its super().__init__ or otherwise handle/store it) so
InternetToolset.__init__ can pass enabled through without raising TypeError;
update InternetBaseToolset.__init__ signature and forwarding logic accordingly.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 8d67d39f-a347-49ea-8f82-7668cbbb0bd2

📥 Commits

Reviewing files that changed from the base of the PR and between 7f883e6 and 7e2aff3.

📒 Files selected for processing (2)
  • holmes/plugins/toolsets/internet/internet.py
  • holmes/plugins/toolsets/kubernetes_logs.py

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — the is_default dead-code concern I raised was addressed in the follow-up commit, and the missing_config refactor is clean and well-tested.

Extended reasoning...

Overview

This PR refactors Toolset.missing_config from a policy-aware method (short-circuiting on enabled/is_default) into a pure fact-check: it returns True only when config_classes declare required fields and self.config is None. The is_default field and all its setter sites across 7+ toolsets were also removed. Tests and the PR template checklist were updated accordingly.

Security risks

None. The change is entirely internal to toolset configuration introspection and does not touch auth, crypto, permissions, or user-facing data paths.

Level of scrutiny

Moderate — the refactor is intentional and well-described, but it does change observable behavior for the edge case where a toolset had is_default=True and enabled=False with required config fields. The PR author explicitly calls this out as the desired fix. All affected toolsets were verified to either have enabled=True or no required config, so no regression is expected. Test coverage was updated to match.

Other factors

The pre-existing FetchNotion.additional_headers attribute-path bug is flagged as a separate, pre-existing issue not introduced by this PR. My prior inline comment about is_default dead code was fully addressed by commit 7f883e6. Evals show 9/10 passing with 1 unrelated setup failure, consistent with baseline.

Comment thread holmes/plugins/toolsets/internet/notion.py
claude added 4 commits March 22, 2026 15:09
These two toolsets were relying on the now-removed is_default field to
be picked up in server mode. Without explicit enabled=True, they would
be silently disabled when enable_all_toolsets=False (server flow).

https://claude.ai/code/session_01U2xED3Qq15dKJKNkHBcXjq
Signed-off-by: Claude <noreply@anthropic.com>
InternetBaseToolset.__init__() has explicit params that don't include
enabled, so we set self.enabled=True after the super call. Only in
InternetToolset, not the base class — NotionToolset should stay
disabled by default.

https://claude.ai/code/session_01U2xED3Qq15dKJKNkHBcXjq
Signed-off-by: Claude <noreply@anthropic.com>
This eval uses kubernetes/logs and will fail if that toolset is not
enabled, providing a regression guard for server-mode enablement.

https://claude.ai/code/session_01U2xED3Qq15dKJKNkHBcXjq
Signed-off-by: Claude <noreply@anthropic.com>
Comment thread holmes/plugins/toolsets/internet/internet.py Outdated
The manifest created namespace app-111 but before_test looked for
events in app-243, causing setup to always fail with "No resources
found in app-243 namespace".

https://claude.ai/code/session_01U2xED3Qq15dKJKNkHBcXjq
Signed-off-by: Claude <noreply@anthropic.com>

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — the critical TypeError I flagged in InternetToolset.__init__ was fixed, is_default was fully removed rather than left as dead code, and CI passes with 0 regressions.

Extended reasoning...

Overview

This PR removes Toolset.is_default entirely and decouples default/enablement logic from config-missing detection. The change touches holmes/core/tools.py (core logic), 7 plugin toolsets (constructor cleanups), 2 test files, a PR template, and a test fixture. Net effect: missing_config is now a pure fact-check independent of enabled/is_default state.

Security risks

No security-sensitive code paths are affected. The change is scoped to toolset initialization and introspection logic.

Level of scrutiny

Moderate — the change touches production toolset initialization code that runs at startup for every request. However, the semantics are straightforward (removing a concept entirely rather than introducing new branching), tests were updated to match, and CI confirms no regressions.

Other factors

The critical regression I reported earlier (TypeError: InternetBaseToolset.__init__() got an unexpected keyword argument enabled) was fixed in commit 51f443c by setting self.enabled = True after super().__init__(). The is_default dead code concern I raised was resolved by fully removing the field from the model, not just removing the reader. The pre-existing notion.py bug I flagged predates this PR and has an inline comment already on the PR. Latest CI run (commit 1d81a5e) shows 10/11 tests passing with 0 regressions (1 setup failure is infrastructure-related and consistent across all runs).

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — the is_default removal is clean, the InternetToolset TypeError was fixed, and evals are 11/11.

Extended reasoning...

Overview

This PR removes the Toolset.is_default field and refactors missing_config into a pure fact-check (does the toolset require config that was not provided?). Changes touch holmes/core/tools.py, 7 plugin toolsets, and corresponding tests. The PR template checklist item for is_default is also removed.

Security Risks

No security-sensitive code touched. The missing_config change is a semantics fix: it now correctly reports missing config even when a toolset is enabled, which is safer than silently hiding the missing-config state.

Level of Scrutiny

This is a refactoring PR with clear intent and bounded scope. The CI eval suite is the best validator here — it went from 0/10 (after the intermediate broken commit) back to 11/11 on the latest commit, confirming no regressions. Test coverage was also updated to match the new semantics.

Other Factors

My earlier blocking concern (the TypeError from passing enabled=True to InternetBaseToolset.__init__) was resolved in commit 51f443c. The is_default dead-code concern was addressed by removing the field entirely rather than leaving it as write-only metadata. The pre-existing FetchNotion._invoke bug (self.toolset.additional_headers) is out of scope for this PR and already flagged as a separate inline comment.

aantn and others added 4 commits March 22, 2026 23:04
Pass enabled=True to super().__init__() instead of setting
self.enabled after construction, matching all other builtin toolsets.

https://claude.ai/code/session_01U2xED3Qq15dKJKNkHBcXjq
Signed-off-by: Claude <noreply@anthropic.com>
InternetBaseToolset.__init__() didn't forward extra keyword arguments
to Toolset.__init__(), causing a TypeError when InternetToolset passed
enabled=True. Add **kwargs forwarding to match other base toolset
patterns (e.g. ElasticsearchBaseToolset).

https://claude.ai/code/session_01U2xED3Qq15dKJKNkHBcXjq
Signed-off-by: Claude <noreply@anthropic.com>

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — all previously identified issues have been resolved.

Extended reasoning...

Overview

This PR refactors toolset enablement by removing the Toolset.is_default field and simplifying Toolset.missing_config to be a pure fact-check (requires config classes with required fields AND no config provided). Touches holmes/core/tools.py, 7 plugin toolsets, 2 test files, and minor test fixture/template updates.

Security risks

No security-sensitive code paths involved. The change affects toolset enablement logic, not auth, crypto, or permissions.

Level of scrutiny

Moderate — this is a behavioral refactoring touching core toolset infrastructure. However, the change is narrowly scoped (removing one field and simplifying one property), and the intent is clearly documented. All 11 eval regression tests pass in the final run.

Prior concerns resolved

  • Critical bug (🔴): InternetToolset.__init__ was passing enabled=True to InternetBaseToolset.__init__ which had no such parameter, causing a TypeError at startup. Fixed in commit 51f443c by moving self.enabled = True after the super().__init__() call — exactly as suggested.
  • Dead code (🟡): is_default field was left as write-only dead code after the missing_config refactor. Fixed by removing the field entirely from Toolset and all 7 setter sites — cleaner than the documentation-only fix I suggested.
  • Pre-existing bug (🟣): FetchNotion._invoke accessing self.toolset.additional_headers is still present but was pre-existing before this PR and already has an inline comment.

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Blocking TypeError is resolved, evals are 11/11, LGTM.

Extended reasoning...

Overview

This PR removes Toolset.is_default entirely and simplifies missing_config to be a pure fact-check (no longer short-circuiting on enabled or is_default). The change touches 8 toolset constructors (removing is_default=True/False), holmes/core/tools.py (field and method simplification), tests, and fixture metadata.

Security risks

No security-sensitive code paths (auth, crypto, permissions) are touched. The changes are purely about toolset enablement logic.

Level of scrutiny

Moderate. This is a behavioral refactor affecting how toolsets report their configuration state, but it is well-scoped: the only intended behavioral change is that toolsets with is_default=True but enabled=False now correctly report missing config rather than silently bypassing the check. The PR description and test changes clearly document this intent.

Other factors

My prior reviews flagged three issues: (1) is_default dead code — addressed by the PR fully removing the field and all setter sites; (2) pre-existing FetchNotion._invoke AttributeError — pre-existing bug, already posted as an inline comment, not introduced by this PR; (3) blocking TypeError from enabled=True being passed to InternetBaseToolset.__init__ — fixed in commit 0357e3b by adding **kwargs to the base class. The latest eval run (commit 0357e3b) shows 11/11 passing, confirming the fix. The refactoring is clean and the test updates correctly reflect the new semantics.

Covers the 8 layers of enablement logic, the CLI vs server
asymmetry, and proposes simplification options.

https://claude.ai/code/session_01U2xED3Qq15dKJKNkHBcXjq
Signed-off-by: Claude <noreply@anthropic.com>
Comment thread specs/toolset-enablement.md
Comment thread holmes/plugins/toolsets/internet/internet.py
…n spec

Addresses PR #1830 review comments:
- Add caller-level tests verifying ToolsetManager._list_all_toolsets
  skips auto-enabling toolsets with missing required config
- Document the missing_config decoupling from enabled state in the spec

https://claude.ai/code/session_01U2xED3Qq15dKJKNkHBcXjq
Signed-off-by: Claude <noreply@anthropic.com>

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — all previously flagged bugs are resolved, 11/11 evals pass, and the remaining inline comments are nits.

Extended reasoning...

Overview

This PR removes Toolset.is_default entirely and decouples missing_config from enabled state. It touches holmes/core/tools.py, eight plugin toolset constructors, a new spec document, and test files. The scope is a clean refactoring with a targeted behavioral fix (user-set enabled: false is now respected even for previously is_default=True toolsets).

Security Risks

No security-sensitive paths (auth, crypto, permissions) are modified. The changes are internal toolset lifecycle logic. No new attack surface is introduced.

Level of Scrutiny

This is moderate-complexity logic that controls which toolsets are active at runtime. The key property is missing_config, whose semantics changed to be a pure fact-check independent of enabled/is_default. The change is well-motivated, correctly implemented, and covered by both unit tests and 11/11 passing eval tests. The fix to InternetBaseToolset.__init__ (accepting **kwargs) that unblocked the critical TypeError regression was confirmed correct.

Other Factors

All three bugs I flagged in earlier review rounds were addressed: the TypeError crash (enabled=True kwarg rejection), the is_default write-only dead code (field fully removed), and the startup regression (0/11 → 11/11 evals). The two new inline reports are nits: a dead test helper that ignores its parameter, and spec documentation inaccuracies. Neither affects production correctness.

Comment thread tests/test_toolset_auto_enable.py
Comment thread specs/toolset-enablement.md Outdated
- Remove confluence from the enabled=True table (it does not set
  enabled=True in its constructor; the enabled=True at line 225 is
  for an internal HttpToolset instance)
- Correct Layer 8 to document that missing_config actively fires
  for confluence, grafana, elasticsearch, servicenow, rabbitmq
- Fix Section 5 to not cite confluence as an always-try toolset
- Nuance Section 2 re CLI override vs missing_config gate

https://claude.ai/code/session_01U2xED3Qq15dKJKNkHBcXjq
Signed-off-by: Claude <noreply@anthropic.com>

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — the blocking TypeError fix, is_default removal, and new TestToolsetManagerAutoEnable integration tests address the main concerns from prior reviews; all 11/11 evals pass.

Extended reasoning...

Overview

This PR refactors toolset enabling by removing Toolset.is_default, decoupling missing_config from the enabled flag, and fixing a regression where InternetToolset could not be instantiated. Changes touch holmes/core/tools.py, 7 plugin toolsets, a new specs/toolset-enablement.md, and test files.

Security risks

No security-sensitive code paths (auth, crypto, permissions) are touched. The change makes missing_config a pure fact-check independent of enabled state, which is strictly safer — it can no longer be silently bypassed by setting enabled=True.

Level of scrutiny

Moderate. The core logic change (missing_config no longer short-circuits on enabled) is small and clearly correct. The **kwargs passthrough fix in InternetBaseToolset.__init__ is minimal. The bulk of the diff is mechanical removal of is_default= arguments across toolsets.

Other factors

Prior reviews from this bot identified: (1) InternetToolset TypeError — fixed in 0357e3b via **kwargs passthrough; (2) is_default write-only dead code — resolved by removing the field entirely; (3) spec inaccuracies — partially addressed in 52245cd with confluence notes; (4) missing integration tests — added in a3cab75. The outstanding nits (spec robusta entry, unused ToolsetStatusEnum import, dead _make_manager_with_toolsets helper, pre-existing notion.py null-guard) were flagged inline and are minor enough not to block. 11/11 evals pass on the latest commit.

Comment thread tests/test_toolset_auto_enable.py
moshemorad
moshemorad previously approved these changes Mar 26, 2026
Comment thread holmes/plugins/toolsets/robusta/robusta.py
@moshemorad
moshemorad merged commit d82fd9b into master Mar 26, 2026
20 of 22 checks passed
@moshemorad
moshemorad deleted the claude/fix-missing-config-toolset-TgjCb branch March 26, 2026 17:00

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — the blocking TypeError from my previous review has been fixed, is_default is fully removed, and evals pass 11/11.

Extended reasoning...

Overview

This PR removes Toolset.is_default and decouples toolset enablement from the missing_config property. missing_config is now a pure fact-check (required config fields present + no config provided), independent of whether the toolset is enabled or was previously default. Fourteen files are touched: the core model in tools.py, eight plugin toolset constructors, two test files, a PR template, and a new specs/toolset-enablement.md doc.

Security risks

No security-sensitive code paths are affected. The change is purely about toolset enablement logic — no auth, crypto, or permission systems are touched.

Level of scrutiny

Moderate: this is a logic refactor in a core abstraction layer. However, the intent is narrow and the diff is mechanical (remove is_default=True/False kwargs, add **kwargs passthrough to InternetBaseToolset). All 11/11 eval regression tests pass across multiple CI runs.

Other factors

In a previous review I flagged a blocking TypeError — InternetToolset passing enabled=True to InternetBaseToolset.__init__ which had no such parameter. This has been resolved by adding **kwargs: Any to InternetBaseToolset.__init__ and forwarding it to Toolset. Minor outstanding nits (unused ToolsetStatusEnum import in the test file, unused _make_manager_with_toolsets helper method) are quality-only issues with no correctness impact.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants