 	//   - index: identifies the output
 	//   - dw: required
 	fileprivate final override func sendActivationToOutputInternal(index: Int, dw: inout DeferredWork) {
-		// Push as *not* activated (i.e. this is the activation)
-		outputs[index].destination.value?.pushInternal(values: activationValues, end: preclosed, activated: false, dw: &dw)
+		guard !activationValues.isEmpty || preclosed != nil else { return }
+		
+		if case .direct = context {
+			outputs[index].destination.value?.pushInternal(values: activationValues, end: preclosed, activated: false, dw: &dw)
+		} else {
+			context.invokeSync { outputs[index].destination.value?.pushInternal(values: activationValues, end: preclosed, activated: false, dw: &dw) }
+		}
 	}
 	
 	// Multiprocessors are (usually – not multicast) preactivated and may cache the values or errors

		guard case .state(let state) = stateOrInitializer else { return }
		
		// Push as *not* activated (i.e. this is the activation)
		outputs[index].destination.value?.pushInternal(values: end == nil ? [state] : [], end: end, activated: false, dw: &dw)
	}
	
	// Multiprocessors are (usually – not multicast) preactivated and may cache the values or errors

	//   - index: identifies the output
	//   - dw: required
	fileprivate final override func sendActivationToOutputInternal(index: Int, dw: inout DeferredWork) {
		guard !cachedValues.isEmpty || cachedEnd != nil else { return }
		
		// Push as *not* activated (i.e. this is the activation)
		if case .direct = context {
			outputs[index].destination.value?.pushInternal(values: cachedValues, end: cachedEnd, activated: false, dw: &dw)
		} else {
			context.invokeSync { outputs[index].destination.value?.pushInternal(values: cachedValues, end: cachedEnd, activated: false, dw: &dw) }
		}
	}
	
	/// Caches values prior to an output connecting
