The scope must be disposed by the body that starts the work — a using declaration or a using statement — because that is what fixes the moment of teardown; a scope without one has no proven disposal point here and is DI001's finding instead. The receiver must be scope-derived: the scope's ServiceProvider, a service resolved through it, or a local that holds either, grown transitively and dropped entirely if any of those locals is reassigned or passed by ref/out. The call must hand back a Task or ValueTask; a synchronous call finishes inside the scope by definition. A task consumed where it stands is not reported — await, await ... .ConfigureAwait(false), .GetAwaiter().GetResult(), .Wait(), an await of the Task.WhenAll it was passed to, or a wait on anything reached from the service, such as a completion property it exposes — and neither is one whose fate this rule cannot name, such as a local declared inside the scope. Work that finishes before it is handed back is not reported either: a body with no await on the path taken, or whose awaits are all of work already over — Task.CompletedTask, Task.FromResult, Task.Delay(0), Task.WhenAll of finished tasks, Task.WhenAny where one is finished, a local or readonly field holding any of those, or an await a preceding IsCompleted check has already settled — because such a call is done before the scope closes. A true or false argument counts here too: a guard clause the call site's own literal sends the body out of is a path with no await on it. Work started inside a lambda, a local function, or a query clause is skipped: a delegate runs when its consumer chooses, and background work started with Task.Run is DI023's finding rather than this rule's. Accepted false negatives: a task whose escape route runs through a helper method, a service resolved from a scope created in another method, and a scope-resolved singleton, which the scope does not own and therefore does not dispose. Accepted false positives: a token cancelled before the call, which leaves the work faulted at its first check but reads here as ordinary escaping work; and a join signalled through something this rule cannot connect back to the task, such as a ManualResetEventSlim the service sets when its work ends, still reads as an escape — waiting on an unrelated handle is far commoner than hand-rolled completion signalling, and treating every later wait as the join would silence real findings.