Summary
UnhookItem can never release a hook that QfcDatamodel registered, because three collaborators each construct their own independent EmailMoveMonitor rather than sharing one. QuickFiler/Controllers/QfcDatamodel.cs:103, QuickFiler/Controllers/QfcQueue.cs:40 and QuickFiler/Controllers/QfcCollectionController.cs:78 each build a separate instance, so the UnhookItem call at QuickFiler/Controllers/QfcQueue.cs:76 consults a hook list that structurally cannot contain the datamodel's registrations. Any unhook routed through QfcQueue is therefore a silent no-op against datamodel-registered items, and the monitor retains those hooks for the life of the object.
Environment
- OS/version:
- Python version:
- Command/flags used:
- Data source or fixture:
Steps to Reproduce
- Register a mail item hook through
QfcDatamodel, which uses the monitor constructed at QuickFiler/Controllers/QfcDatamodel.cs:103.
- Route an unhook for that same item through
QfcQueue, which calls UnhookItem at QuickFiler/Controllers/QfcQueue.cs:76 against the distinct monitor constructed at QuickFiler/Controllers/QfcQueue.cs:40.
- Inspect the datamodel monitor's hook list and observe the hook is still present.
Expected Behavior
The unhook releases the item, whichever collaborator registered it.
Actual Behavior
The unhook is a no-op. The two monitors are separate objects with separate hook lists, so the lookup cannot match.
Logs / Screenshots
Impact / Severity
Correctness and lifetime issue rather than a crash. Hooks accumulate and are never released through this path.
Source
From: docs/features/potential/2026-08-26-quickfiler-emailmovemonitor-instances-not-shared.md
Summary
UnhookItemcan never release a hook thatQfcDatamodelregistered, because three collaborators each construct their own independentEmailMoveMonitorrather than sharing one.QuickFiler/Controllers/QfcDatamodel.cs:103,QuickFiler/Controllers/QfcQueue.cs:40andQuickFiler/Controllers/QfcCollectionController.cs:78each build a separate instance, so theUnhookItemcall atQuickFiler/Controllers/QfcQueue.cs:76consults a hook list that structurally cannot contain the datamodel's registrations. Any unhook routed throughQfcQueueis therefore a silent no-op against datamodel-registered items, and the monitor retains those hooks for the life of the object.Environment
Steps to Reproduce
QfcDatamodel, which uses the monitor constructed atQuickFiler/Controllers/QfcDatamodel.cs:103.QfcQueue, which callsUnhookItematQuickFiler/Controllers/QfcQueue.cs:76against the distinct monitor constructed atQuickFiler/Controllers/QfcQueue.cs:40.Expected Behavior
The unhook releases the item, whichever collaborator registered it.
Actual Behavior
The unhook is a no-op. The two monitors are separate objects with separate hook lists, so the lookup cannot match.
Logs / Screenshots
Impact / Severity
Correctness and lifetime issue rather than a crash. Hooks accumulate and are never released through this path.
Source
From: docs/features/potential/2026-08-26-quickfiler-emailmovemonitor-instances-not-shared.md