flutter-memory-leak-engineering
Skill8 starsChanged 48 days agoMITView on GitHub
Diagnose, prevent, test, and regress-test Flutter/Dart memory lifecycle defects using leak_tracker, leak_tracker_flutter_testing, FlutterMemoryAllocations, and DevTools Memory. Use this skill whenever Flutter work involves controllers, FocusNode, AnimationController, ScrollController, ChangeNotifier, subscriptions, timers, listeners, Bloc/Cubit disposal, GetIt/session scopes, route or widget retention, unexplained memory growth, leak_tracker failures, leak-test false positives, disposal/GC confusion, caches, BuildContext retention, or memory-leak CI—even if the user only says “memory keeps growing” or “find the leak.”
In this repository70 other files it gives its agents.
- camerawesome-flutterSkill
- dart-args-production-cliSkill
- dart-flutter-equatable-engineeringSkill
- dart-flutter-ffi-systems-engineeringSkill
- dart-metaSkill
- document-camera-frameSkill
- document-scan-flutterSkill
- figma-to-flutter-expertSkill
- flutter-animations-production-engineeringSkill
- flutter-app-hardening-reverse-engineeringSkill
- flutter-app-icon-engineeringSkill
- flutter-application-security-engineeringSkill
- flutter-app-links-deep-link-engineeringSkill
- flutter-cachingSkill
- flutter-concurrency-memory-performanceSkill
- flutter-confetti-engineeringSkill
- flutter-dart-package-engineeringSkill
- flutter-design-system-from-design-mdSkill
- flutter-dio-cache-interceptor-engineeringSkill
- flutter-dio-engineeringSkill
- flutter-doc-scannerSkill
- flutter-drift-persistence-engineeringSkill
- flutter-expert-tipsSkill
- flutter-firebase-analyticsSkill
- flutter-firebase-core-engineeringSkill
- flutter-firebase-messagingSkill
- flutter-get-it-injectable-dependency-injectionSkill
- flutter-go-router-engineeringSkill
- flutter-hive-persistence-engineeringSkill
- flutter-image-performanceSkill
- flutter-image-picker-production-engineeringSkill
- flutter-lints-static-analysis-engineeringSkill
- flutter-local-notifications-production-engineeringSkill
- flutter-mobile-developmentSkill
- flutter-motion-engineeringSkill
- flutter-multi-environmentSkill
- flutter-native-splash-engineeringSkill
- flutter-package-plugin-selectionSkill
- flutter-path-provider-production-storageSkill
- flutter-performance-jank-optimizationSkill
- flutter-permission-handler-engineeringSkill
- flutter-pinputSkill
- flutter-production-build-releaseSkill
- flutter-production-engineeringSkill
- flutter-production-loggingSkill
- flutter-pro-image-editor-engineeringSkill
- flutter-secure-storage-security-engineeringSkill
- flutter-sentry-engineeringSkill
- flutter-share-plus-engineeringSkill
- flutter-skeletonizer-engineeringSkill
- flutter-squadron-concurrency-engineeringSkill
- flutter-supabase-engineeringSkill
- flutter-svg-engineeringSkill
- flutter-ui-performance-engineeringSkill
- flutter-url-launcher-engineeringSkill
- flutter-video-player-production-engineeringSkill
- flutter-webview-production-engineeringSkill
- freezed-production-engineeringSkill
- html-to-flutterSkill
- hydrated-blocSkill
- The first 60 shown.
The file
Show its rules and text
We split this skill into the rules it gives an agent
63 rules. About 0 are common, 40 are distinctive, and 23 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈40
Distinctive · estimate
This author's own choices. Worth a look.
23
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 9
Treat leak_tracker as lifecycle verification, not as a universal heap leak detector.
- Very specific: line 12
Prefer one clear owner for every disposable/cancelable/removable resource.
- Very specific: line 13
Keep longer-lived objects from retaining shorter-lived widgets, routes, sessions, controllers, or BuildContext unless the lifetime is …
- Distinctive: line 14
Use standard not-disposed checking as the high-signal default.
- Distinctive: line 15
Do not silence failures before finding the creation site, owner, teardown path, and retaining reference.
- Distinctive: line 16
Do not treat increasing RSS as proof of a tracked Dart lifecycle leak.
- Distinctive: line 18
Keep fixed lifecycle bugs as deterministic regression tests.
- Very specific: line 33
verify experimentalLeakTesting, LeakTesting.settings, and allocation instrumentation against that SDK.
- Distinctive: line 34
treat running-app, Web, not-GCed, and other experimental behavior as version-sensitive.
- Distinctive: line 44
Do not load every reference by default.
- Very specific: line 68
Do not fix a notDisposed report by adding cleanup to an arbitrary consumer.
- Distinctive: line 81
Use focused retaining-path diagnostics and DevTools when the chain is unclear.
- Distinctive: line 93
Before changing code, answer:
- Distinctive: line 105
Use the bundled lifecycle table for details.
- Distinctive: line 122
Treat this as suspicious:
- Distinctive: line 135
Before modifying lifecycle code:
- Very specific: line 136
Search controllers: TextEditingController, ScrollController, PageController, TabController, AnimationController.
- Very specific: line 137
Search focus/ticker objects: FocusNode, Ticker.
- Very specific: line 138
Search subscriptions: .listen(, StreamSubscription.
- Very specific: line 139
Search timers: Timer(, Timer.periodic.
- Very specific: line 140
Search listener APIs: addListener, addObserver, subscribe.
- Very specific: line 141
Search global/static retention: static final, static var, singleton registries, global collections.
- Distinctive: line 148
Do not add cleanup until ownership is understood.
- Distinctive: line 152
Keep dependency direction from shorter-lived toward longer-lived services.
- Very specific: line 160
Add a focused create/exercise/release test for non-trivial lifetimes.
- Distinctive: line 161
Start with ordinary not-disposed tracking.
- Distinctive: line 182
Use repeated open/close cycles when the suspected defect accumulates over navigation.
- Very specific: line 188
Keep global diagnostics lightweight.
- Very specific: line 190
Do not mutate global leak settings casually inside ordinary setUp blocks.
- Very specific: line 197
if disposed but retained, withDisposalStackTrace().
- Very specific: line 200
use DevTools Memory for heap snapshots, diffs, allocation tracing, and retaining references when needed.
- Very specific: line 201
Do not enable creation/disposal stacks plus retaining paths for every CI test.
- Distinctive: line 203
Before adding an ignore, verify:
- Very specific: line 209
test-created disposables use addTearDown.
- Distinctive: line 213
Only after that, add the narrowest ignore with a documented reason/upstream issue where applicable.
- Distinctive: line 215
Do not normalize application-owned leaks with count-based budgets.
- Distinctive: line 239
Use heap profiling and cache metrics for that class of problem.
- Very specific: line 241
Do not store BuildContext in long-lived services.
- Distinctive: line 249
Use DI lifetime analysis when route/session resources survive too long.
- Distinctive: line 266
verify no app singleton retains session objects.
- Very specific: line 269
If code manually creates a Bloc/Cubit, its creator normally owns close().
- Distinctive: line 270
If an owning provider creates it, let the provider close it according to its contract.
- Very specific: line 271
Do not register route-specific mutable Bloc/Cubit/controller state as an app singleton for convenience.
- Distinctive: line 276
When an input/dependency changes:
- Distinctive: line 293
Do not write cleanup only for the happy path.
- Distinctive: line 296
Add a focused lifecycle/leak test where practical.
- Distinctive: line 300
Verify the explicit cleanup contract.
- Distinctive: line 305
Add retaining-path diagnostics only if needed.
- Distinctive: line 307
Run the broader suite.
- Very specific: line 309
Do not stop at “added dispose()” if a strong reference still retains the object.
- Distinctive: line 311
Use DevTools Memory when:
- Distinctive: line 328
Do not “fix” unexplained growth by indiscriminately clearing memory.
- Distinctive: line 330
Keep the main leak suite high-signal:
- Distinctive: line 340
use a supported stable test platform.
- Distinctive: line 341
keep expensive diagnostics off by default.
- Distinctive: line 343
document known framework ignores.
- Distinctive: line 357
Do not ship heavy leak diagnostics into production by default.
- Very specific: line 377
Read references/04-antipatterns.md for concrete examples and corrections.
- Distinctive: line 379
When reviewing or fixing memory lifecycle code, report:
- Distinctive: line 393
test lifecycle/false positive.
- Distinctive: line 403
every affected disposable/cancelable resource has a clear owner.
- Distinctive: line 407
no app/session singleton unintentionally retains route/widget objects.
- Distinctive: line 417
no claim of “memory leak fixed” is made without reproducing and verifying the relevant lifecycle or heap behavior.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Flutter Memory Leak Engineering
Operating rules
- Diagnose ownership before adding cleanup calls.
- Treat
leak_trackeras lifecycle verification, not as a universal heap leak detector. - Distinguish
notDisposed,notGCed, andgcedLate; they describe different failures and require different fixes. - Separate disposal from garbage collection: disposed objects can remain retained, and collected objects can still have violated a cleanup contract.
- Prefer one clear owner for every disposable/cancelable/removable resource.
- Keep longer-lived objects from retaining shorter-lived widgets, routes, sessions, controllers, or
BuildContextunless the lifetime is intentional. - Use standard not-disposed checking as the high-signal default; enable expensive/experimental retention diagnostics only for focused investigations.
- Do not silence failures before finding the creation site, owner, teardown path, and retaining reference.
- Do not treat increasing RSS as proof of a tracked Dart lifecycle leak.
- Escalate unresolved growth or retaining chains to Flutter DevTools Memory.
- Keep fixed lifecycle bugs as deterministic regression tests.
- Preserve repository architecture unless ownership/lifetime is actually wrong.
Research baseline and freshness
The supplied guide targets leak_tracker 11.0.2 and the current split between:
leak_trackerfor core tracking/classification;leak_tracker_testingfor test helpers;leak_tracker_flutter_testingfor Flutter widget-test integration;- Flutter
FlutterMemoryAllocationsfor framework lifecycle instrumentation; - Flutter DevTools Memory for heap, diff, allocation, and retaining-reference investigation. The guide explicitly notes that direct leak-tracker DevTools integration from older releases was removed in 11.0.0. Do not copy old tutorials that assume that integration still exists.
Before implementation:
- inspect
pubspec.yamlandpubspec.lock; - identify Flutter and Dart versions;
- identify current leak-tracker package versions;
- verify
experimentalLeakTesting,LeakTesting.settings, and allocation instrumentation against that SDK; - treat running-app, Web, not-GCed, and other experimental behavior as version-sensitive.
Reference routing
Load only the references needed for the task:
| Task | Read |
| Need exact leak categories, package roles, setup, instrumentation, GC semantics, settings, or ignore APIs | references/01-tracker-foundations.md |
Need ownership analysis, Flutter controller/listener lifetimes, BuildContext, closures, caches, Bloc/Cubit, DI scopes, or async lifetime guidance | references/02-ownership-lifetimes.md |
| Need widget/route tests, false-positive analysis, report interpretation, DevTools escalation, CI, regression testing, or performance overhead | references/03-testing-diagnostics-ci.md |
| Reviewing/fixing common lifecycle mistakes | references/04-antipatterns.md |
| Implementing a new resource, auditing an existing repository, refactoring, or running production-readiness checklists | references/05-workflows-checklists.md |
| Do not load every reference by default. |
Core mental model
For every lifecycle-sensitive object, reason through:
create
→ instrumentation observes creation where supported
→ owner retains/uses object
→ owner's lifetime ends or object is replaced
→ required cleanup executes
→ unnecessary strong references are released
→ object becomes unreachable
→ GC eventually reclaims itClassify the failure at the first broken transition.
notDisposed
Interpret as a cleanup-contract failure first.
Investigate:
- who created the object;
- who owns it;
- whether ownership was transferred;
- what event ends ownership;
- which cleanup API is required (
dispose,close,cancel,remove,removeListener, etc.); - whether normal, error, replacement, and early-return paths invoke it.
Do not fix a
notDisposedreport by adding cleanup to an arbitrary consumer.
notGCed
Interpret as disposed-but-retained.
Investigate strong references from:
- static/global collections;
- app singletons;
- session objects after logout;
- listener registries/event buses;
- closures;
- caches;
- DI scopes;
- test/framework state. Use focused retaining-path diagnostics and DevTools when the chain is unclear.
gcedLate
Interpret as delayed retention, not automatic permanent leakage.
Check:
- active animations/transitions;
- queued callbacks/microtasks;
- pending async work;
- test teardown timing;
- temporary framework ownership;
- repeated workflows that accumulate retained objects.
Ownership decision procedure
Before changing code, answer:
- Resource: What exactly requires lifecycle management?
- Creator: Which object/function creates it?
- Owner: Which scope is responsible for its lifetime?
- Lifetime: App, session, feature, route, widget, request, or test?
- Cleanup: Which explicit operation ends it?
- Transfer: Is another component intentionally taking ownership?
- Replacement: Can the resource be swapped before owner teardown?
- References: Can any longer-lived object retain it after cleanup?
- Verification: Can the lifecycle be reproduced in a focused test? The creator is normally the owner unless ownership transfer is explicit.
Typical Flutter ownership
Use the bundled lifecycle table for details. High-frequency cases:
TextEditingController,FocusNode,ScrollController,AnimationController,ValueNotifier, locally createdChangeNotifier→ creator disposes.StreamSubscription→ caller oflisten()cancels.Timer→ starter cancels.- manually created Bloc/Cubit → creator closes unless ownership is transferred to an owning provider.
- provider-created Bloc/Cubit → follow provider ownership contract; do not double-close.
- manually created
OverlayEntry→ remove, then dispose. - app/session socket → app/session owner closes.
- manually registered listener/observer → registrant removes/unsubscribes. Externally provided controllers/resources are not automatically owned by the receiver.
Lifetime-direction rule
Prefer:
short-lived object
→ depends on
long-lived serviceTreat this as suspicious:
long-lived singleton/service
→ strong reference to
route/widget/session objectEspecially inspect:
- singleton →
BuildContext; - singleton →
State; - singleton → route controller;
- global callback/listener → page object;
- app scope → current-user resource that should end on logout.
Repository inspection workflow
Before modifying lifecycle code:
- Search controllers:
TextEditingController,ScrollController,PageController,TabController,AnimationController. - Search focus/ticker objects:
FocusNode,Ticker. - Search subscriptions:
.listen(,StreamSubscription. - Search timers:
Timer(,Timer.periodic. - Search listener APIs:
addListener,addObserver,subscribe; find matching removal. - Search global/static retention:
static final,static var, singleton registries, global collections. - Inspect DI registrations, scopes, and disposal callbacks.
- Inspect manually created state-management objects and provider ownership.
- Inspect route-owned controllers and whether route pop actually destroys the owner.
- Inspect caches for bounds/eviction/lifecycle reset.
- Inspect async callbacks that may outlive owners.
- Inspect overlays, navigation observers, sockets, database watchers, and custom registries. Do not add cleanup until ownership is understood.
Implementation workflow for a new resource
- Identify its cleanup contract.
- Choose its owner/lifetime explicitly.
- Keep dependency direction from shorter-lived toward longer-lived services.
- Make ownership transfer explicit in API design.
- Store handles required for teardown: subscription, timer, listener callback, overlay entry, etc.
- Implement cleanup at the owner boundary.
- Clean the old resource before replacement when appropriate.
- Clean partial initialization on error/early exit.
- Minimize callback captures; avoid retaining
BuildContextor whole state graphs unnecessarily. - Instrument custom objects when leak regression tests need lifecycle visibility.
- Add a focused create/exercise/release test for non-trivial lifetimes.
- Start with ordinary not-disposed tracking; investigate retention only when needed.
Flutter widget and route test pattern
Design leak tests as:
mount/create
→ exercise
→ unmount/pop
→ settle/cancel expected async work
→ leak evaluationA test that leaves the owner intentionally mounted is not a valid proof that its owned controller leaked.
For route tests:
open route
→ exercise
→ pop
→ finish transition
→ verify route absent
→ leak evaluationUse repeated open/close cycles when the suspected defect accumulates over navigation.
Global test setup
For Flutter widget suites, the supplied guide uses test/flutter_test_config.dart with:
LeakTesting.enable();- global
LeakTesting.settings; createdByTestHelpers: truewhen helper-created objects should be filtered. Keep global diagnostics lightweight. Per-test differences belong inexperimentalLeakTesting.
Do not mutate global leak settings casually inside ordinary setUp blocks.
Focused diagnostic escalation
Escalate in this order:
- default leak test;
- identify class/category;
withCreationStackTrace()to locate creation;- verify owner cleanup;
- if disposed but retained,
withDisposalStackTrace(); - enable targeted experimental not-GCed tracking if relevant;
withRetainingPath()for the focused reproduction;- use DevTools Memory for heap snapshots, diffs, allocation tracing, and retaining references when needed. Do not enable creation/disposal stacks plus retaining paths for every CI test; the guide notes meaningful CPU/memory/test-time overhead.
Test false-positive triage
Before adding an ignore, verify:
- owner actually unmounted/popped;
- route transition finished;
- test gesture ended;
- manually created
OverlayEntrywas removed before disposal; - async work/timers/subscriptions completed or were canceled;
- test-created disposables use
addTearDown; - Flutter image-cache retention is relevant to the test;
- helper/framework-created objects are correctly classified;
- exact GC timing is not being assumed. Only after that, add the narrowest ignore with a documented reason/upstream issue where applicable.
Do not normalize application-owned leaks with count-based budgets.
Test false-negative triage
A passing leak suite only means configured tracked lifecycle violations were not observed.
Escalate beyond leak_tracker when the suspected issue may be:
- uninstrumented custom objects;
- an intentionally reachable but unbounded collection;
- image/data cache bloat;
- native/plugin memory;
- GPU/platform-view resources;
- large allocation churn;
- release-only behavior;
- Web/version-specific behavior not reproduced by widget tests.
Caches
Differentiate intentional retention from leakage.
A healthy cache should have an explicit policy such as:
- maximum size/count;
- TTL;
- LRU/eviction;
- lifecycle reset;
- memory-pressure response. An app-global unbounded map retaining every value can be a serious memory defect even if leak_tracker never reports it.
Use heap profiling and cache metrics for that class of problem.
BuildContext and closure retention
Do not store BuildContext in long-lived services.
A closure is risky when its lifetime exceeds the lifetime of the widget/state/data it captures. When a global registry, event bus, singleton, timer, or subscription stores that callback, remove it at teardown or redesign the interaction.
A mounted check protects UI mutation after disposal; it does not cancel the resource and is not a lifecycle cleanup strategy.
For non-cancelable Futures, use stale-result/generation guards where needed, but recognize that they do not release the Future early.
DI and session scopes
Use DI lifetime analysis when route/session resources survive too long.
Preferred shape:
App scope
→ long-lived repositories/infrastructure
Session scope
→ user-specific sockets/caches/repositories
Route/feature scope
→ controller / Bloc / Cubit / subscriptionsOn logout/account switch:
- close/dispose session resources;
- pop/reset the session scope;
- clear/revoke credentials/data according to security/domain requirements;
- verify no app singleton retains session objects. Popping DI scope does not automatically erase secure storage, database data, or server tokens.
State-management rules
- If code manually creates a Bloc/Cubit, its creator normally owns
close(). - If an owning provider creates it, let the provider close it according to its contract.
- Do not register route-specific mutable Bloc/Cubit/controller state as an app singleton for convenience.
- Apply the same ownership reasoning to Provider, Riverpod, ChangeNotifier, and custom state systems.
Replacement and update lifecycle
Leaks often occur before final dispose() because resources are replaced.
When an input/dependency changes:
remove listener/cancel/dispose old owned resource
→ assign/create new resource
→ attach new listenerFor widget lifecycle code, inspect didUpdateWidget and similar update hooks for duplicate listener registration or missing detachment.
Error-path cleanup
Handle partial initialization:
acquire A
→ acquire B
→ C fails
→ release B if created
→ release A
→ rethrow/return failureDo not write cleanup only for the happy path.
Leak-fix workflow
- Reproduce the issue narrowly.
- Add a focused lifecycle/leak test where practical.
- Identify the leak category.
- Find the creation site.
- Identify intended owner and lifetime.
- Verify the explicit cleanup contract.
- Verify cleanup executes.
- Inspect long-lived references.
- Fix the closest actual owner/retainer.
- Re-run the focused test.
- Add retaining-path diagnostics only if needed.
- Escalate to DevTools if heap behavior remains unexplained.
- Run the broader suite.
- Keep regression coverage.
Do not stop at “added
dispose()” if a strong reference still retains the object.
DevTools escalation
Use DevTools Memory when:
- memory grows while leak tests pass;
- not-GCed persists and retaining cause is unclear;
- a cache/global collection is suspected;
- native/external memory dominates;
- repeated navigation increases retained counts;
- allocation origin needs investigation. Workflow:
- define a repeatable scenario;
- capture baseline memory/heap snapshot;
- repeat lifecycle;
- capture diff snapshot;
- identify growing classes/instances;
- inspect inbound/retaining references;
- trace allocations if creation sites are unclear;
- fix ownership/retention;
- repeat the same profile. Do not “fix” unexplained growth by indiscriminately clearing memory.
CI strategy
Keep the main leak suite high-signal:
widget/integration lifecycle tests
→ LeakTesting globally enabled
→ not-disposed checks
→ helper filtering where justified
→ targeted retention tests separatelyCI rules:
- control Flutter/package versions;
- use a supported stable test platform;
- keep expensive diagnostics off by default;
- avoid broad ignores;
- document known framework ignores;
- fail application-owned disposal regressions;
- do not retry-until-green;
- track flakiness;
- isolate/reset global test state;
- preserve fixed leak tests.
Performance policy
Leak tracking has overhead, and focused stack/retaining-path diagnostics are materially more expensive.
Optimize the diagnostic configuration before optimizing tracker internals:
- ordinary suite: lightweight lifecycle checks;
- focused local test: creation/disposal stacks as needed;
- focused retention case: experimental not-GCed + retaining path;
- heap/global growth: DevTools Memory. Do not ship heavy leak diagnostics into production by default. The supplied guide treats widget tests as the primary mature use case and release tracking as disabled/not the intended production strategy.
Anti-pattern gates
Reject these fixes/assumptions:
- adding
dispose()without knowing ownership; - disposing an externally owned controller;
- using
mountedinstead of canceling a timer/subscription; - assuming
dispose()means unreachable; - assuming GC means cleanup was correct;
- storing
BuildContextin a singleton; - leaving manually registered callbacks/listeners in global registries;
- making route controllers app singletons;
- leaving user/session resources alive after logout;
- keeping unbounded static caches;
- using broad ignore rules to make CI pass;
- expecting exact GC timing;
- enabling maximum leak diagnostics across the full suite;
- treating RSS growth as proof of a particular Dart leak;
- treating a passing leak suite as proof of no memory problem;
- disposing
OverlayEntrywithout removing it first; - relying on garbage collection for resources requiring deterministic cleanup.
Read
references/04-antipatterns.mdfor concrete examples and corrections.
Review report format
When reviewing or fixing memory lifecycle code, report:
Symptom
What grows, remains retained, fails leak testing, or survives a lifecycle boundary.
Evidence
Leak category/report, reproduction, heap trend, retaining path, or lifecycle code evidence.
Ownership
Creator, owner, intended lifetime, and cleanup contract.
Root cause
Choose the actual class of failure:
- missing disposal/cancel/remove;
- disposed but retained;
- delayed expected retention;
- lifetime inversion;
- unbounded cache/global state;
- test lifecycle/false positive;
- uninstrumented/native memory requiring DevTools.
Change
Smallest ownership/lifecycle correction.
Verification
Focused test plus broader suite/profile where applicable.
Residual risk
Experimental/version-sensitive behavior, uninstrumented objects, native memory, or untested platform flow.
Production definition of done
Memory lifecycle work is complete when:
- every affected disposable/cancelable resource has a clear owner;
- ownership transfer is explicit;
- cleanup runs on normal, replacement, error, and teardown paths as applicable;
- externally owned objects are not double-disposed;
- no app/session singleton unintentionally retains route/widget objects;
BuildContext/Stateis not stored beyond its intended lifetime;- listeners/subscriptions/timers/sockets are removed or canceled at the correct boundary;
- route/session DI lifetimes match actual ownership;
- caches/global collections have intentional bounds or lifecycle policy;
- leak tests release the owner before asserting cleanup;
- application-owned leak reports are fixed rather than broadly ignored;
- expensive diagnostics are focused, not permanently enabled suite-wide;
- fixed lifecycle defects have regression coverage;
- unexplained memory growth has been escalated to heap/native profiling where leak_tracker cannot prove the cause;
- no claim of “memory leak fixed” is made without reproducing and verifying the relevant lifecycle or heap behavior.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

