diff --git a/routing/result_interpretation.go b/routing/result_interpretation.go
index <HASH>..<HASH> 100644
--- a/routing/result_interpretation.go
+++ b/routing/result_interpretation.go
@@ -348,6 +348,10 @@ func (i *interpretedResult) processPaymentOutcomeIntermediate(
 
 		reportOutgoing()
 
+		// All nodes up to the failing pair must have forwarded
+		// successfully.
+		i.successPairRange(route, 0, errorSourceIdx-1)
+
 	// If we get a permanent channel, we'll prune the channel set in both
 	// directions and continue with the rest of the routes.
 	case *lnwire.FailPermanentChannelFailure:
diff --git a/routing/result_interpretation_test.go b/routing/result_interpretation_test.go
index <HASH>..<HASH> 100644
--- a/routing/result_interpretation_test.go
+++ b/routing/result_interpretation_test.go
@@ -362,6 +362,7 @@ var resultTestCases = []resultTestCase{
 			pairResults: map[DirectedNodePair]pairResult{
 				getTestPair(1, 2): failPairResult(0),
 				getTestPair(2, 1): failPairResult(0),
+				getTestPair(0, 1): successPairResult(100),
 			},
 			policyFailure: getPolicyFailure(1, 2),
 		},
routing: report success up to the failing node on FailChannelDisabled