Skip to content

feat(plugin): gate activation and search on setup readiness#571

Merged
chumyin merged 6 commits into
devfrom
feature/plugin-setup-readiness-20260325
Mar 26, 2026
Merged

feat(plugin): gate activation and search on setup readiness#571
chumyin merged 6 commits into
devfrom
feature/plugin-setup-readiness-20260325

Conversation

@chumyin
Copy link
Copy Markdown
Collaborator

@chumyin chumyin commented Mar 25, 2026

Summary

  • Problem:
    runtime planning still treated plugins as ready once bridge and adapter checks passed, even when manifest-declared required env vars or config keys were missing.
  • Why it matters:
    that created a false-ready state in activation and tool search, which weakens operator trust and does not scale for a broader plugin ecosystem.
  • What changed:
    this re-lands the setup-readiness slice from the earlier stacked work onto current dev.
    activation planning now evaluates typed setup requirements against a shared readiness context, marks plugins as setup_incomplete when required setup is missing, and carries missing env and config requirements on activation candidates.
    tool search now exposes setup_ready, missing_required_env_vars, and missing_required_config_keys.
    spec execution derives a conservative default readiness context from non-empty process env vars only, and regression coverage now covers verified, missing, and boundary-value cases.
  • What did not change (scope boundary):
    this does not inject explicit readiness context from RunnerSpec yet, does not mutate user config, and does not add plugin-specific heuristics. explicit config and env readiness injection remains follow-up scope in [Feature]: Allow spec runners to inject verified plugin setup context #560.

Linked Issues

Change Type

  • Bug fix
  • Feature
  • Refactor
  • Documentation
  • Security hardening
  • CI / workflow / release

Touched Areas

  • Kernel / policy / approvals
  • Contracts / protocol / spec
  • Daemon / CLI / install
  • Providers / routing
  • Tools
  • Browser automation
  • Channels / integrations
  • ACP / conversation / session runtime
  • Memory / context assembly
  • Config / migration / onboarding
  • Docs / contributor workflow
  • CI / release / workflows

Risk Track

  • Track A (routine / low-risk)
  • Track B (higher-risk / policy-impacting)

Validation

  • cargo fmt --all -- --check
  • cargo clippy --workspace --all-targets --all-features -- -D warnings
  • cargo test --workspace --locked -- --test-threads=1
  • cargo test --workspace --all-features --locked -- --test-threads=1
  • Relevant architecture / dep-graph / docs checks for touched areas
  • Additional scenario, benchmark, or manual checks when behavior changed
  • If this changes config/env fallback, limits, or defaults: include before/after behavior and regression coverage for explicit path, fallback path, and boundary values
  • If tests mutate process-global env: document how state is restored or serialized

Commands and evidence:

cargo fmt --all -- --check
cargo clippy --workspace --all-targets --all-features -- -D warnings
cargo test --workspace --locked -- --test-threads=1
cargo test --workspace --all-features --locked -- --test-threads=1

All commands passed.

Before:
- plugins with supported bridge and adapter surfaces could still appear ready when required setup metadata was unsatisfied.

After:
- activation planning separates runtime-supported plugins from setup-complete plugins via `setup_incomplete`
- tool search surfaces `setup_ready=false` plus missing required env and config keys
- the default fallback path only treats non-empty process env vars as verified, with regression coverage for blank-name and blank-value boundaries

User-visible / Operator-visible Changes

  • Plugin activation reports setup-incomplete plugins separately from runtime-blocked plugins.
  • Tool-search results now show whether setup is actually ready and which required env or config keys are still missing.

Failure Recovery

  • Fast rollback or disable path:
    revert this PR to restore the previous bridge-and-adapter-only readiness behavior.
  • Observable failure symptoms reviewers should watch for:
    plugins without setup requirements being downgraded unexpectedly, or tool-search results omitting readiness fields for setup-aware plugins.

Reviewer Focus

  • crates/kernel/src/plugin_ir.rs for the shared readiness evaluator and the activation-state split between runtime blockers and setup-incomplete plugins.
  • crates/spec/src/spec_execution.rs and crates/spec/src/spec_execution/tool_search.rs for the conservative default readiness context and search-surface wiring.
  • crates/daemon/tests/integration/spec_runtime.rs for the end-to-end behavior that proves setup-incomplete plugins are surfaced without being treated as ready.

Summary by CodeRabbit

  • New Features
    • Tool search results and entries now indicate plugin setup readiness and include lists of any missing required environment variables or configuration keys.
  • Tests
    • Added integration and unit tests covering setup verification, readiness detection, platform-specific env-var matching, and related behaviors.
  • Documentation
    • Updated architecture/release notes to reflect recent project metrics.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Mar 25, 2026

Warning

Rate limit exceeded

@chumyin has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 5 minutes and 9 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: df355d8d-f665-4436-86e4-901511ef7289

📥 Commits

Reviewing files that changed from the base of the PR and between b192530 and a68e456.

📒 Files selected for processing (15)
  • crates/app/src/channel/mod.rs
  • crates/bench/tests/bench_integration.rs
  • crates/daemon/tests/integration/architecture.rs
  • crates/daemon/tests/integration/programmatic.rs
  • crates/daemon/tests/integration/spec_runtime.rs
  • crates/daemon/tests/integration/spec_runtime_bridge/http_json.rs
  • crates/daemon/tests/integration/spec_runtime_bridge/process_stdio.rs
  • crates/kernel/src/bootstrap.rs
  • crates/kernel/src/lib.rs
  • crates/kernel/src/plugin_ir.rs
  • crates/spec/src/spec_execution.rs
  • crates/spec/src/spec_execution/tool_search.rs
  • crates/spec/src/spec_runtime.rs
  • crates/spec/src/test_support.rs
  • docs/releases/architecture-drift-2026-03.md
📝 Walkthrough

Walkthrough

Runtime readiness evaluation added: process environment is captured into a PluginSetupReadinessContext, threaded through activation planning and tool-search, used to mark plugins SetupIncomplete and surface missing required env vars and config keys in activation plans and search results.

Changes

Cohort / File(s) Summary
Kernel Core Types
crates/kernel/src/plugin_ir.rs, crates/kernel/src/lib.rs
Add PluginSetupReadinessContext, PluginSetupReadiness, evaluate_plugin_setup_requirements(); add PluginActivationStatus::SetupIncomplete; extend PluginActivationCandidate/PluginActivationPlan with missing-required fields and setup_incomplete_plugins; update PluginTranslator::plan_activation signature to accept context.
Spec Execution Integration
crates/spec/src/spec_execution.rs, crates/spec/src/spec_execution/tool_search.rs
Build PluginSetupReadinessContext from process env; thread it through execute_spec_with_native_tool_executor, execute_spec_operation, and execute_tool_search; evaluate setup readiness for tool-search entries and attach readiness/missing lists.
Runtime Schema
crates/spec/src/spec_runtime.rs
Add setup_ready, missing_required_env_vars, and missing_required_config_keys to ToolSearchEntry and ToolSearchResult (serialized shape changed).
Tests & Fixtures
crates/kernel/src/bootstrap.rs, crates/daemon/tests/integration/spec_runtime.rs
Update test fixtures to include new setup fields; add integration test verifying a plugin with unmet required env/config is classified SetupIncomplete, surfaces missing items, and does not appear as ready in catalog.
Docs
docs/releases/architecture-drift-2026-03.md
Generated hotspot metrics and timestamp update (documentation-only change).

Sequence Diagram(s)

sequenceDiagram
    participant Executor as Spec Executor
    participant Context as PluginSetupReadinessContext
    participant Planner as PluginTranslator
    participant Readiness as Setup Evaluator
    participant Search as Tool Search

    Executor->>Context: Build from process env
    Executor->>Planner: plan_activation(translation, matrix, context)
    Planner->>Readiness: evaluate_plugin_setup_requirements(required_envs, required_configs, context)
    Readiness-->>Planner: readiness result (ready/missing lists)
    alt Bridge & adapter OK
        alt Setup requirements met
            Planner->>Planner: Mark plugin Ready
        else Setup incomplete
            Planner->>Planner: Mark plugin SetupIncomplete (attach missing items)
        end
    else Bridge or adapter unsupported
        Planner->>Planner: Mark plugin Unsupported
    end
    Planner-->>Executor: PluginActivationPlan
    Executor->>Search: execute_tool_search(..., context)
    Search->>Readiness: evaluate per-entry requirements
    Readiness-->>Search: populate setup_ready and missing_required_* fields
    Search-->>Executor: ToolSearchResult
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related issues

Possibly related PRs

Suggested labels

docs, size: M

Suggested reviewers

  • gh-xj

Poem

🐇 I sniffed the env, I checked the keys,

Missing bits I counted with ease.
Now plans tell truth, not half a light —
I hop, I twirl, and nibble the night! ✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 58.06% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely summarizes the main change: adding setup readiness evaluation to gate plugin activation and search functionality.
Linked Issues check ✅ Passed All objectives from issue #551 are met: setup readiness evaluation layer implemented, missing requirements surfaced in activation candidates and tool-search, setup-incomplete plugins distinguished from runtime-blocked, typed metadata-driven evaluation, and regression coverage added.
Out of Scope Changes check ✅ Passed All changes are directly related to implementing setup readiness evaluation as scoped in #551; no setup execution, config mutation, or plugin-specific heuristics were introduced.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/plugin-setup-readiness-20260325

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

@chumyin chumyin self-assigned this Mar 25, 2026
@github-actions github-actions Bot added kernel Kernel policy, approvals, and audit surfaces. spec Architecture boundaries, product specs, and design docs. daemon Daemon binary, CLI entrypoints, and install flow. size: M Medium pull request: 201-500 changed lines. labels Mar 25, 2026
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

Caution

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

⚠️ Outside diff range comments (1)
crates/kernel/src/plugin_ir.rs (1)

126-156: ⚠️ Potential issue | 🟠 Major

Add #[serde(default)] to new struct fields and document enum variant compatibility.

Lines 146–147 (missing_required_env_vars, missing_required_config_keys) and line 155 (setup_incomplete_plugins) lack #[serde(default)] attributes. Without them, deserialization of older payloads—which omit these fields—will fail. Additionally, the new SetupIncomplete enum variant (line 130) requires documented compatibility guidance for external consumers. Per coding guidelines, kernel contracts must be backward-compatible with no breaking changes without documented decision.

🧩 Minimal serde compatibility patch
 pub struct PluginActivationCandidate {
     pub plugin_id: String,
     pub source_path: String,
     pub source_kind: PluginSourceKind,
     pub package_root: String,
     pub package_manifest_path: Option<String>,
     pub bridge_kind: PluginBridgeKind,
     pub adapter_family: String,
     pub status: PluginActivationStatus,
     pub reason: String,
+    #[serde(default)]
     pub missing_required_env_vars: Vec<String>,
+    #[serde(default)]
     pub missing_required_config_keys: Vec<String>,
     pub bootstrap_hint: String,
 }
 
 pub struct PluginActivationPlan {
     pub total_plugins: usize,
     pub ready_plugins: usize,
+    #[serde(default)]
     pub setup_incomplete_plugins: usize,
     pub blocked_plugins: usize,
     pub candidates: Vec<PluginActivationCandidate>,
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@crates/kernel/src/plugin_ir.rs` around lines 126 - 156, Add serde defaulting
for the newly added optional fields and document the enum change: annotate
PluginActivationCandidate::missing_required_env_vars and
::missing_required_config_keys with #[serde(default)] so older payloads missing
those fields deserialize to empty Vecs, and annotate
PluginActivationPlan::setup_incomplete_plugins with #[serde(default)] so missing
counts default to 0; also add a brief compatibility note in the kernel
contract/docs that the PluginActivationStatus enum gained the SetupIncomplete
variant and describe its semantics and backward-compatibility expectations for
external consumers (i.e., clients should treat unknown/new variants gracefully
or update parsing accordingly).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@crates/daemon/tests/integration/spec_runtime.rs`:
- Around line 1133-1160: The test assumes TAVILY_API_KEY is missing which is
non-deterministic; before asserting readiness from the plugin file (the block
that writes tavily_search.py using plugin_root and plugin_file and then checks
readiness), explicitly clear or override the environment key (call
std::env::remove_var("TAVILY_API_KEY") or set it to an empty value with
std::env::set_var("TAVILY_API_KEY", "")) so the missing-env path is
deterministic, and apply the same change for the other occurrences around the
plugin setup (the section spanning the current lines ~1232-1235).

In `@crates/kernel/src/plugin_ir.rs`:
- Around line 87-116: The current contains() check in
evaluate_plugin_setup_requirements incorrectly treats env var names as
case-sensitive on Windows; update the env var verification to perform
platform-aware matching by using case-insensitive comparison on Windows (e.g.
use eq_ignore_ascii_case or compare lowercased strings) when checking
required_env_var against entries in context.verified_env_vars (inside the loop
over required_env_vars and the env_var_is_verified check), while keeping the
existing case-sensitive behavior on non-Windows platforms so config keys and
other logic remain unchanged.

In `@crates/spec/src/spec_execution.rs`:
- Around line 783-794: The loop over env_vars currently trims raw_name before
inserting into verified_env_vars which can turn malformed keys like "
TAVILY_API_KEY" into "TAVILY_API_KEY" and incorrectly mark readiness; change the
logic so you only use trim() to test for blankness but preserve the original
raw_name when inserting. Concretely, in the env_vars iteration (variables
raw_name, raw_value, verified_env_vars) convert raw_name.to_string_lossy() to a
temporary (e.g., name_str), use name_str.trim().is_empty() to skip blanks, but
insert the untrimmed name_str (not the trimmed version) into verified_env_vars;
apply the same blank-check approach to raw_value but keep the stored value
handling unchanged.

---

Outside diff comments:
In `@crates/kernel/src/plugin_ir.rs`:
- Around line 126-156: Add serde defaulting for the newly added optional fields
and document the enum change: annotate
PluginActivationCandidate::missing_required_env_vars and
::missing_required_config_keys with #[serde(default)] so older payloads missing
those fields deserialize to empty Vecs, and annotate
PluginActivationPlan::setup_incomplete_plugins with #[serde(default)] so missing
counts default to 0; also add a brief compatibility note in the kernel
contract/docs that the PluginActivationStatus enum gained the SetupIncomplete
variant and describe its semantics and backward-compatibility expectations for
external consumers (i.e., clients should treat unknown/new variants gracefully
or update parsing accordingly).

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 224d0b45-4f57-4623-a5b5-99f0a6c0504a

📥 Commits

Reviewing files that changed from the base of the PR and between e422933 and ee278a0.

📒 Files selected for processing (7)
  • crates/daemon/tests/integration/spec_runtime.rs
  • crates/kernel/src/bootstrap.rs
  • crates/kernel/src/lib.rs
  • crates/kernel/src/plugin_ir.rs
  • crates/spec/src/spec_execution.rs
  • crates/spec/src/spec_execution/tool_search.rs
  • crates/spec/src/spec_runtime.rs

Comment thread crates/daemon/tests/integration/spec_runtime.rs
Comment thread crates/kernel/src/plugin_ir.rs
Comment thread crates/spec/src/spec_execution.rs
@github-actions github-actions Bot added documentation Improvements or additions to documentation. size: L Large pull request: 501-1000 changed lines. and removed size: M Medium pull request: 201-500 changed lines. labels Mar 26, 2026
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

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)
crates/kernel/src/plugin_ir.rs (1)

179-193: ⚠️ Potential issue | 🟠 Major

Include setup-incomplete candidates in has_blockers().

Line 190 only checks blocked_plugins. After adding setup_incomplete_plugins, this can return false even when no plugin is actually activatable.

Proposed fix
 impl PluginActivationPlan {
     #[must_use]
     pub fn has_blockers(&self) -> bool {
-        self.blocked_plugins > 0
+        self.blocked_plugins > 0 || self.setup_incomplete_plugins > 0
     }
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@crates/kernel/src/plugin_ir.rs` around lines 179 - 193, The has_blockers()
method on struct PluginActivationPlan currently only checks blocked_plugins;
update it to also consider setup_incomplete_plugins so it returns true when
either blocked_plugins > 0 OR setup_incomplete_plugins > 0 (i.e., any non-zero
blocker count). Modify the PluginActivationPlan::has_blockers implementation to
include setup_incomplete_plugins in the condition (referencing
PluginActivationPlan, has_blockers, blocked_plugins, and
setup_incomplete_plugins) so plans with setup-incomplete candidates are treated
as blocked.
🤖 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 `@crates/kernel/src/plugin_ir.rs`:
- Around line 179-193: The has_blockers() method on struct PluginActivationPlan
currently only checks blocked_plugins; update it to also consider
setup_incomplete_plugins so it returns true when either blocked_plugins > 0 OR
setup_incomplete_plugins > 0 (i.e., any non-zero blocker count). Modify the
PluginActivationPlan::has_blockers implementation to include
setup_incomplete_plugins in the condition (referencing PluginActivationPlan,
has_blockers, blocked_plugins, and setup_incomplete_plugins) so plans with
setup-incomplete candidates are treated as blocked.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: ea0521fd-1fa0-440b-8d97-cfcc0c8d1d4d

📥 Commits

Reviewing files that changed from the base of the PR and between ee278a0 and fb93c6b.

📒 Files selected for processing (4)
  • crates/daemon/tests/integration/spec_runtime.rs
  • crates/kernel/src/plugin_ir.rs
  • crates/spec/src/spec_execution.rs
  • docs/releases/architecture-drift-2026-03.md
✅ Files skipped from review due to trivial changes (2)
  • docs/releases/architecture-drift-2026-03.md
  • crates/daemon/tests/integration/spec_runtime.rs
🚧 Files skipped from review as they are similar to previous changes (1)
  • crates/spec/src/spec_execution.rs

@chumyin chumyin force-pushed the feature/plugin-setup-readiness-20260325 branch from fb93c6b to b192530 Compare March 26, 2026 04:20
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
crates/spec/src/spec_execution.rs (1)

771-774: Config keys intentionally empty per PR scope.

Setting verified_config_keys: BTreeSet::new() means config-key readiness will always report missing. This aligns with the PR scope ("does not inject explicit readiness context from RunnerSpec") with follow-up tracked in #560.

Consider adding a brief comment explaining this is intentional for future readers:

📝 Optional documentation improvement
     PluginSetupReadinessContext {
         verified_env_vars,
+        // Config key verification deferred to follow-up (`#560`); empty means all config requirements report missing.
         verified_config_keys: BTreeSet::new(),
     }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@crates/spec/src/spec_execution.rs` around lines 771 - 774, The
PluginSetupReadinessContext currently initializes verified_config_keys with
BTreeSet::new(), which intentionally leaves config-key readiness empty per PR
scope; add a concise inline comment next to the verified_config_keys:
BTreeSet::new() initialization mentioning this is deliberate (e.g.,
"intentionally empty — RunnerSpec readiness not injected in this PR; tracked in
`#560`") so future readers understand this is expected behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@crates/spec/src/spec_execution.rs`:
- Around line 771-774: The PluginSetupReadinessContext currently initializes
verified_config_keys with BTreeSet::new(), which intentionally leaves config-key
readiness empty per PR scope; add a concise inline comment next to the
verified_config_keys: BTreeSet::new() initialization mentioning this is
deliberate (e.g., "intentionally empty — RunnerSpec readiness not injected in
this PR; tracked in `#560`") so future readers understand this is expected
behavior.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 20dd37b0-cd4b-4660-b767-e2c79ab2fc59

📥 Commits

Reviewing files that changed from the base of the PR and between fb93c6b and b192530.

📒 Files selected for processing (8)
  • crates/daemon/tests/integration/spec_runtime.rs
  • crates/kernel/src/bootstrap.rs
  • crates/kernel/src/lib.rs
  • crates/kernel/src/plugin_ir.rs
  • crates/spec/src/spec_execution.rs
  • crates/spec/src/spec_execution/tool_search.rs
  • crates/spec/src/spec_runtime.rs
  • docs/releases/architecture-drift-2026-03.md
✅ Files skipped from review due to trivial changes (4)
  • crates/kernel/src/lib.rs
  • crates/kernel/src/bootstrap.rs
  • docs/releases/architecture-drift-2026-03.md
  • crates/daemon/tests/integration/spec_runtime.rs
🚧 Files skipped from review as they are similar to previous changes (2)
  • crates/spec/src/spec_runtime.rs
  • crates/spec/src/spec_execution/tool_search.rs

@github-actions github-actions Bot added size: XL Very large pull request: more than 1000 changed lines. and removed size: L Large pull request: 501-1000 changed lines. labels Mar 26, 2026
@chumyin chumyin force-pushed the feature/plugin-setup-readiness-20260325 branch from 40c628e to a68e456 Compare March 26, 2026 04:40
@github-actions github-actions Bot added the channels Channel adapters and external integration surfaces. label Mar 26, 2026
@chumyin chumyin merged commit dc5c4c2 into dev Mar 26, 2026
15 checks passed
@chumyin chumyin deleted the feature/plugin-setup-readiness-20260325 branch March 26, 2026 04:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

channels Channel adapters and external integration surfaces. daemon Daemon binary, CLI entrypoints, and install flow. documentation Improvements or additions to documentation. kernel Kernel policy, approvals, and audit surfaces. size: XL Very large pull request: more than 1000 changed lines. spec Architecture boundaries, product specs, and design docs.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: Evaluate plugin setup readiness before activation and search

1 participant