Answer
Rather than relying on a proxy field like Cancel Reason being populated, check the record's actual resulting state directly — add a condition that the record's NEW Rowstate specifically equals 'Cancelled', rather than just checking that it changed away from 'Reserved' or that some other related field has a value. Checking the actual target-state transition explicitly (Rowstate = 'Cancelled') distinguishes a genuine cancellation from other operations — like undoing a manual reservation — that also move the line's Rowstate out of 'Reserved' without actually cancelling it.