Result tells the caller of a streaming parser whether a record came out. It says nothing about whether the parser moved a cursor, touched scratch storage or left the input alone, and after an incomplete record that is what matters. Who owns those bytes now, and where does the next call begin?
The shape I'd propose. The caller owns a byte vector and lends the parser a shared slice. The parser owns its cursor and its temporary decoded fields. On success the cursor moves past one complete record. On incomplete input it stays at that record's start and the tentative fields are discarded. Malformed input also keeps the start and returns the offending offset. An incomplete diagnostic carries the record start plus the position scanning reached, which records what was inspected and consumes nothing.
Returning Err gives none of this. The parser has to stage updates and commit only on success. Then the caller keeps the unconsumed suffix, appends bytes and retries. If a successful record borrows from the vector, though, which read still needs it when the append begins? That read finishes first.
Taking ownership of the vector would raise its own question, whether failure hands it back. Borrowing avoids that, and the failure position and allowed next calls still belong in the docs.