You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Two defects on the EFC filing (OK) chain, both carried out of the issue #637 scoping analysis and
deliberately excluded from that fix. First, the two keyboard entry points to ActionOkAsync have no
exception handler, so an exception thrown during filing becomes an unhandled UI-thread exception.
Second, on the button entry point the exception is caught, but ActionOkAsync hides the form before
awaiting the filing operation and disposes it only afterwards, so a throw leaves the form hidden,
undisposed, and uncleaned with no user-visible message.
This entry also records a third, smaller item: EfcDataModel.OpenOlFolderAsync and OpenFsFolderAsync assign DestinationOlStem verbatim in exactly the same shape that issue #637
corrects in the string overload of MoveToFolderAsync, and are not covered by that fix.
Correction to the record. Issue #637 states that an InvalidOperationException from Globals.Ol.ArchiveRootPath "becomes an unhandled UI-thread exception" because ButtonOK_Click is async void and rethrows. That premise is inaccurate against the current tree. ButtonOK_Click is async void, but it delegates to ButtonOkClickAsync, which wraps the whole
chain in try { ... } catch (System.Exception ex) { BoundaryErrorSink(ex.Message, ex); }
(QuickFiler/Controllers/EfcFormController.cs:460-475). The exception is therefore logged, not
unhandled, on the button path. The genuine defects are the two described above, which is why they
were separated from issue #637 rather than folded into it.
Environment
OS/version: Windows 11 Pro 10.0.26200; .NET Framework 4.8.1 VSTO add-in.
Data source or fixture: Repository source at that commit.
Steps to Reproduce
Put the add-in into a state where Globals.Ol.ArchiveRootPath is unresolvable or cross-store, so
that ArchiveRootPathGuard.RequireResolvedArchiveRoot
(TaskMaster/AppGlobals/ArchiveRootPathGuard.cs:32-60) throws InvalidOperationException. The
value is cached only on success (TaskMaster/AppGlobals/AppOlObjects.cs:253-267), so the throw
recurs on every read.
Open the Email Filer Control form with an item selected and a valid destination chosen.
Path A (keyboard): trigger filing with the always-on Keys.Return action
(QuickFiler/Controllers/EfcFormController.cs:392) or the 'K' character action routed through KbdExecuteAsync(ActionOkAsync) (:623, :683; KbdExecuteAsync is declared at :894-904 and
contains no try/catch). Observe an unhandled UI-thread exception.
Path B (button): trigger filing with the OK button. The exception is caught by ButtonOkClickAsync (:462-475) and routed to BoundaryErrorSink. Observe that the form was
already hidden by ActionOkAsync at :756 before the await at :759, and that _formViewer.Dispose(); Cleanup(); at :769-770 never run. The item is not filed and no message
is shown.
Expected Behavior
An archive-root configuration failure aborts the filing operation benignly: the user is told the
operation could not be completed, the form completes its teardown deterministically, and no
unhandled exception reaches the message pump from any entry point. Every entry point to ActionOkAsync has the same exception posture.
Actual Behavior
The three entry points to ActionOkAsync have two different exception postures. The button path
catches and logs but leaves a half-completed teardown and shows the user nothing. The two keyboard
paths do not catch at all, so the exception is unhandled on the UI thread.
Logs / Screenshots
Attached minimal logs or screenshot
Snippet: not applicable; established by source tracing. See QuickFiler/Controllers/EfcFormController.cs:392, :460-475, :738-772, :894-904; QuickFiler/Controllers/EfcHomeController.ExecuteMoves.cs:32-47; TaskMaster/AppGlobals/ArchiveRootPathGuard.cs:32-60.
Impact / Severity
Blocker
High
Medium
Low
The trigger requires a misconfigured or cross-store archive root, so it is not expected in normal
operation. Severity is Medium because one of the two outcomes is an unhandled UI-thread exception in
a VSTO add-in, and the other silently abandons a filing operation the user believes has completed.
Summary
Two defects on the EFC filing (OK) chain, both carried out of the issue #637 scoping analysis and
deliberately excluded from that fix. First, the two keyboard entry points to
ActionOkAsynchave noexception handler, so an exception thrown during filing becomes an unhandled UI-thread exception.
Second, on the button entry point the exception is caught, but
ActionOkAsynchides the form beforeawaiting the filing operation and disposes it only afterwards, so a throw leaves the form hidden,
undisposed, and uncleaned with no user-visible message.
This entry also records a third, smaller item:
EfcDataModel.OpenOlFolderAsyncandOpenFsFolderAsyncassignDestinationOlStemverbatim in exactly the same shape that issue #637corrects in the
stringoverload ofMoveToFolderAsync, and are not covered by that fix.Correction to the record. Issue #637 states that an
InvalidOperationExceptionfromGlobals.Ol.ArchiveRootPath"becomes an unhandled UI-thread exception" becauseButtonOK_Clickisasync voidand rethrows. That premise is inaccurate against the current tree.ButtonOK_Clickisasync void, but it delegates toButtonOkClickAsync, which wraps the wholechain in
try { ... } catch (System.Exception ex) { BoundaryErrorSink(ex.Message, ex); }(
QuickFiler/Controllers/EfcFormController.cs:460-475). The exception is therefore logged, notunhandled, on the button path. The genuine defects are the two described above, which is why they
were separated from issue #637 rather than folded into it.
Environment
against
origin/mainatecdb1c84ba8541ab67042985919cfed4df768c01.Steps to Reproduce
Globals.Ol.ArchiveRootPathis unresolvable or cross-store, sothat
ArchiveRootPathGuard.RequireResolvedArchiveRoot(
TaskMaster/AppGlobals/ArchiveRootPathGuard.cs:32-60) throwsInvalidOperationException. Thevalue is cached only on success (
TaskMaster/AppGlobals/AppOlObjects.cs:253-267), so the throwrecurs on every read.
Keys.Returnaction(
QuickFiler/Controllers/EfcFormController.cs:392) or the'K'character action routed throughKbdExecuteAsync(ActionOkAsync)(:623,:683;KbdExecuteAsyncis declared at:894-904andcontains no try/catch). Observe an unhandled UI-thread exception.
ButtonOkClickAsync(:462-475) and routed toBoundaryErrorSink. Observe that the form wasalready hidden by
ActionOkAsyncat:756before theawaitat:759, and that_formViewer.Dispose(); Cleanup();at:769-770never run. The item is not filed and no messageis shown.
Expected Behavior
An archive-root configuration failure aborts the filing operation benignly: the user is told the
operation could not be completed, the form completes its teardown deterministically, and no
unhandled exception reaches the message pump from any entry point. Every entry point to
ActionOkAsynchas the same exception posture.Actual Behavior
The three entry points to
ActionOkAsynchave two different exception postures. The button pathcatches and logs but leaves a half-completed teardown and shows the user nothing. The two keyboard
paths do not catch at all, so the exception is unhandled on the UI thread.
Logs / Screenshots
QuickFiler/Controllers/EfcFormController.cs:392,:460-475,:738-772,:894-904;QuickFiler/Controllers/EfcHomeController.ExecuteMoves.cs:32-47;TaskMaster/AppGlobals/ArchiveRootPathGuard.cs:32-60.Impact / Severity
The trigger requires a misconfigured or cross-store archive root, so it is not expected in normal
operation. Severity is Medium because one of the two outcomes is an unhandled UI-thread exception in
a VSTO add-in, and the other silently abandons a filing operation the user believes has completed.
Source
From: docs/features/potential/2026-08-29-efc-ok-chain-unhandled-keyboard-paths-and-half-completed-teardown.md