Repository navigation
Bug: breadcrumb-suggestions-upgrade-silently-stale-on-superseded-lease #502
Description
- Work Mode: full-bug
Summary
BreadcrumbCoordinatorUpgradeLifetime.RunSynchronous discards the bool that TryRunCurrent
returns, so when a lease has been superseded the guarded action is skipped silently. In
BreadcrumbBridgeCoordinator.SetSuggestions the assignment to the public SuggestionsUpgrade handle
lives inside that skipped action, so the method returns normally while SuggestionsUpgrade still
holds its previous value and the caller awaits an upgrade that will never run.
Environment
- OS/version: Windows 11 Pro 10.0.26200
- Python version: n/a (C# / .NET Framework 4.8.1 WinForms VSTO add-in with Microsoft WebView2)
- Command/flags used: n/a - reached through the QuickFiler ItemViewer breadcrumb selector
- Data source or fixture: two breadcrumb suggestion populations issued close enough together that the
first lease is superseded before its guarded action runs
Steps to Reproduce
This is a concurrency and ordering defect established by code inspection. No existing test reproduces
it, because nothing in the suite supersedes a lease between BeginPopulation and RunSynchronous.
- Call
BreadcrumbBridgeCoordinator.SetSuggestionsto begin a suggestion population. - Arrange for the lease to be invalidated between
BeginPopulation
(QuickFiler/Viewers/BreadcrumbBridgeCoordinator.cs:104) andRunSynchronous(:105) - nothing
spans the two atomically. - Await the coordinator's
SuggestionsUpgradehandle.
Expected Behavior
Either the caller learns that the population was superseded - via a return value, an exception, or a
SuggestionsUpgrade set to a completed or cancelled task - or SuggestionsUpgrade is left in a state
that cannot be mistaken for a fresh in-flight upgrade.
Actual Behavior
SetSuggestions returns normally. SuggestionsUpgrade silently retains its previous value, so a
caller awaiting it either waits on a stale completed task or believes a new upgrade is in flight when
none is. Nothing observable distinguishes this from a successful population.
Logs / Screenshots
- Attached minimal logs or screenshot
- Snippet: n/a - the defect is a silent no-op with no error text.
Impact / Severity
- Blocker
- High
- Medium
- Low
Rationale: reachable only under a supersession race that current call patterns make narrow, and the
observable consequence is a stale suggestion set rather than data loss. Recorded for traceability
because the silent-skip mechanism is general and would become more reachable if suggestion population
were made more concurrent.
Source
From: docs/features/potential/2026-08-08-breadcrumb-suggestions-upgrade-silently-stale-on-superseded-lease.md
Activity
docs(495): F12 lifecycle-coordinator research, feature docs, defect p…
Merge pull request #659 from drmoisan/bug/breadcrumb-coordinator-hub-…
drmoisan commentedon Sep 1, 2026
Closing as completed. Delivered under
breadcrumb-coordinator-hub-defects-501, merged via PR #659 (merge commit4cb709db), an ancestor oforigin/main. The delivering spec states "Issue: #501 (also closes #462, #500, #502)."Confirmed directly against
origin/main:BreadcrumbCoordinatorUpgradeLifetime.RunSynchronousno longer discardsTryRunCurrent'sbool: it now returnstrueon success and, on a superseded lease, callsAbandon(lease)before returningfalse— settling the lease instead of silently skipping it.BreadcrumbBridgeCoordinator.Suggestions.cs'sSetSuggestionsnow setsSuggestionsUpgrade = Task.CompletedTask;on the skip path, so the handle is never left stale pointing at a previous population.All corresponding invariants this issue drove (AC-12, AC-13, AC-14, I-502.1/I-502.2/I-502.4) are checked
[x]in the spec, plus the companion lease-leak invariant AC-15/I-502.3 and its regression test (AC-19).Verified during an admission check against the
bugs-638-644-647parallel run (2026-09-01). No branch or PR remains to ship; this was left open only as bookkeeping.