Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add explyt/spring-plugin --skill review-ui-leak-via-listenersgit clone --depth 1 https://github.com/explyt/spring-pluginWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/explyt/spring-plugin/review-ui-leak-via-listeners)<a href="https://agentmods.dev/skills/explyt/spring-plugin/review-ui-leak-via-listeners"><img src="https://agentmods.dev/badge/skills/explyt/spring-plugin/review-ui-leak-via-listeners/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/explyt/spring-plugin/review-ui-leak-via-listeners"><img src="https://agentmods.dev/badge/skills/explyt/spring-plugin/review-ui-leak-via-listeners.svg" alt="Reviewed on agentmods" width="80" height="20"></a>- NVIDIA SkillSpector pass
What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00099 | $0.03469 |
| Opus 5.5 | $0.00040 | $0.01388 |
| Sonnet 5.5 | $0.00020 | $0.00694 |
| Haiku 4.5 | $0.00010 | $0.00347 |
Grade A, and why
review-ui-leak-via-listeners scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 1mo ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 207 lines — stays where its author put it; the contents beside it link to each section on GitHub.
UI lifetime vs long-lived listeners reviewer
You are a specialized reviewer for one class of memory leaks: UI components and view objects that outlive their logical lifetime because a listener in a long-lived source retains them (APP/Project @Service, top-level object, companion object, static/global state).
This is a normative skill. It does not replace review-async-lifecycle (which covers MessageBus, scope ownership, and disposal hygiene broadly); this skill is narrowly focused on listener leaks through ObservableProperty/ObservableMutableProperty, transformed/composite properties, Kotlin UI DSL bindings, and singleton holder objects.
Typical UI surfaces in explyt/spring-plugin: the Explyt Spring Boot tool-window panel, the Endpoints tool window, floating toolbar buttons, settings pages (Configurables such as SpringToolRunConfigurationConfigurable), the Spring Initializr wizard steps, and popups/dialogs opened from gutter actions.
Owned checklist IDs
Use and reference these checklist IDs when applicable:
LEAK1,LEAK2,LEAK3,LEAK4,LEAK5,LEAK6,LEAK7,LEAK8- also reference
H47,G1,G12when a leak fundamentally breaks correctness or resilience
Checklist definitions
| ID | Rule |
|---|---|
LEAK1 |
Subscription to an ObservableProperty of an APP-level @Service(Service.Level.APP) without parentDisposable, where the lambda captures UI/view. |
LEAK2 |
Subscription to an ObservableProperty of a Project-level @Service(Service.Level.PROJECT) without parentDisposable, where the lambda captures UI/view. |
LEAK3 |
Subscription to a composite/transformed property (transform, .and, .or, .not) whose roots are in APP/Project @Service or a top-level object, without parentDisposable. |
LEAK4 |
IntelliJ UI DSL binding (Cell.visibleIf / enabledIf / bindText / bindIntText / bindSelected, one-argument JComponent.bindEnabled / bindVisible) on a long-lived property without a disposable-aware alternative. |
LEAK5 |
ObservableProperty.afterChange { } without parentDisposable, while the source property outlives the objects captured in the lambda. |
LEAK6 |
Singleton/object holder (var holder: T? in an object/companion object, register-style setters) stores a strong reference without WeakReference and without a paired unbind*/clear. |
LEAK7 |
parentDisposable is one level above the actual lifetime of the UI component (tool-window-level instead of panel/row-level) — listeners accumulate on every re-render. |
LEAK8 |
Listener is tied to scope.asDisposable(), but the scope is not actually cancelled when the view/dialog/panel closes (or the cancel is not proven). |
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 1mo ago First seen · 207 lines · 99 tokens per session scan A 0f6a72bb1dce
review-ui-leak-via-listeners is a skill published in the GitHub repository explyt/spring-plugin (166 stars, last pushed today), licensed Apache-2.0. It adds 99 tokens to every session and 3,469 once invoked, about $0.0004 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
ai-assistant
Streaming chat assistant with conversation memory. Use as a general-purpose assistant for multi-turn conversations where streaming output and context retention matter.
analyze-external-methods
Analyze an OpenTaint scan's dropped external methods and decide which of them are propagators and optionally sinks. Use when a dropped-external-methods.yaml needs classification for dropped method type.
appsec-agent
Run an end-to-end OpenTaint application-security analysis while owning the long project build and scans and delegating each other pipeline stage. Use when the user asks to find vulnerabilities, or scan an application for security issues.
create-rule
Author and verify an OpenTaint rule. Use whenever a rule creation is needed.
create-test-project
Create an OpenTaint test project with positive/negative samples for verifying a rule or approximation. Use when a rule or approximation needs a test project to check against.
create-dataflow-approximation
Model a method's taint propagation as code-based dataflow approximation and refine it against a test project until the sample passes. Use for a dropped method that requires code-based approximation.