{"version":"2.1.269","anchor":"plugin-calls-now-reject-when-the-calling-plugin-isnt-admitt","canonical_anchor":"plugin-calls-now-reject-when-the-calling-plugin-isnt-admitt","heading":"Plugin admission state now enforced for cross-plugin calls and hook loading","tier":"internal","area":"Plugins","scope":null,"heads_up":null,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.269\/e\/plugin-calls-now-reject-when-the-calling-plugin-isnt-admitt","release_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.269","markdown":"### Plugin admission state now enforced for cross-plugin calls and hook loading\n\nClaude Code now checks whether a plugin has actually been admitted (not just loaded) before letting it make cross-plugin calls or keeping its hooks registered\n\n**What**\n\n- Cross-plugin calls (using the `$.<name>.<method>` syntax one plugin uses to call into another) now check whether the target plugin's environment has actually been admitted, and reject with a clear error if it hasn't \u2014 previously this only checked whether the plugin was loaded at all.\n\n- The code that loads a plugin's hook modules was reworked from a single pass into a loop that admits or refuses each module. If a module that already ran its `engine.create` hook later turns out to be refused, the whole set of already-admitted modules is discarded and reloading is retried without it, with a log message noting this happened. The loop repeats until no plugin still needs to be recreated.\n\n**Why**\n\nThese changes make sure a plugin can't act (call other plugins, or keep hooks registered) unless it has genuinely passed admission, closing a gap where a loaded-but-not-admitted plugin could previously be treated as usable.\n\n- Area: Plugins\n- Tier: Under the hood\n- Useful: 1\/5\n- Signal: 2\/5"}