Each case in this DU has identicat "payload" (pos), so I consider it as duplication.
What about factoring `pos` out like this?

```fsharp
type PositionKind =
    /// let record = {<insert-here>}
    | AfterLeftBrace
    /// let y = { x with<insert-here> }
    | AfterCopyExpression
    /// let x = { <insert-here>Field1 = ... }
    | BeforeFirstField

[<RequireQualifiedAccess>]
[<NoComparison>]
type RecordStubsInsertionPosition = 
    { Kind: PositionKind 
      Pos: pos }
    static member FromRecordExpression (expr: RecordExpression) =
        match expr.FieldExpressionList with
        | [] ->
            match expr.CopyExpressionOpt with
            | None ->
                let exprRange = expr.Expression.Range
                { Kind = AfterLeftBrace; Pos = Pos.fromZ (exprRange.StartLine - 1) (exprRange.StartColumn + 1) }
            | Some(_toCopy, (withSeparator, _)) ->
                { Kind = AfterCopyExpression; Pos = withSeparator.End }

        | fstFieldInfo :: _ ->
            let ((fstField, _), _, _) = fstFieldInfo
            { Kind = BeforeFirstField; Pos = fstField.Range.Start }
```
It eliminates `Position` member as well.