lash-plugin-mcp
Must expose MCP servers as ordinary Lash tool providers and keep one connection pool per LashCore; it must not add an alternate tool-execution path, session persistence, or per-session stdio process pool (unenforced). Streamable HTTP credentials are static host-supplied headers: this crate must not silently enable rmcp OAuth or token refresh, and its lifecycle/policy tests exercise those boundaries. Anchors: crates/lash-plugin-mcp/src/lib.rs, crates/lash-plugin-mcp/src/pool.rs.
lash-plugin-process-controls
May register only the session process-list and process-cancel control tools over core/tool-support contracts; it must not implement process scheduling, leases, persistence, or protocol-specific copies of those controls (unenforced). Protocol crates consume the registered tools and must not absorb their behavior. Anchors: crates/lash-plugin-process-controls/src/lib.rs, crates/lash-plugin-process-controls/Cargo.toml.
lash-plugin-tool-output-budget
May project a truncated model-visible result and spill the full text to its non-durable temporary directory; it must not change the underlying tool outcome, execute tools, write durable session state, or own general context compaction (unenforced). Budget behavior must remain a plugin contribution, not a branch in core or a concrete tool. Anchors: crates/lash-plugin-tool-output-budget/src/lib.rs, crates/lash-plugin-tool-output-budget/Cargo.toml.
lash-llm-tools
May implement focused LLM-backed tools through core's direct-completion seam; llm_query must not use tools, inspect files, or acquire context beyond its explicit task and inputs, and this crate must not construct a provider transport or child runtime (unenforced). Model and generation policy come from the current session unless the host supplies an explicit override. Anchors: crates/lash-llm-tools/src/lib.rs, crates/lash-llm-tools/Cargo.toml.
lash-tool-support
Must remain shared scaffolding for tool schemas, bindings, and static providers; it must not contain a concrete user-visible tool, tool-catalog policy, provider client, or runtime orchestration (unenforced). Concrete tool crates may depend on it; it must not depend on them. Anchors: crates/lash-tool-support/src/lib.rs, crates/lash-tool-support/src/static_provider.rs, crates/lash-tool-support/Cargo.toml.
lash-tools
May implement the built-in shell and web tool families over lash-tool-support; local grep, file indexing, product filesystem policy, provider selection, and runtime persistence must remain outside this crate (unenforced). The standard-stack tests additionally enforce that the shipped bundle contains neither grep nor host filesystem tools. Anchors: crates/lash-tools/src/lib.rs, crates/lash-standard-plugins/src/lib.rs, docs/architecture/modules.html.
lash-standard-plugins
Must compose existing plugin/tool factories rather than implement runtime, protocol, provider, or store mechanisms (unenforced). Web tools must remain opt-in on an explicit Tavily key, and standard_stack_does_not_install_cli_local_grep plus standard_stack_does_not_install_host_filesystem_tools enforce that host-local capabilities do not leak into the default stack. Anchors: crates/lash-standard-plugins/src/lib.rs, crates/lash-standard-plugins/Cargo.toml.
lash-subagents
May define subagent capability selection and register orchestration/leaf tools, but child execution must use core session and tool-access contracts; this crate must not create an independent runtime, provider client, persistence model, or protocol implementation (unenforced). Capability and parent authority must remain explicit inputs to the plugin factory. Anchors: crates/lash-subagents/src/lib.rs, crates/lash-subagents/src/capability.rs, crates/lash-subagents/Cargo.toml.