A library copy can have one active borrower, while a title can have several people waiting. Mixing those identities makes a return from the wrong member appear valid or lets a repeated hold jump the queue. Start with the domain invariant.
These small low-level design tasks check loan ownership, authorized returns, fair holds and overdue policy. They are deliberately bounded components, not a complete library system. Use a class when it makes state ownership clearer, or a pure function when the supplied transition sequence is enough. The checker evaluates behavior. A return succeeds once, a repeated hold stays in its original place and the due day itself has no overdue charge. Empty inputs remain valid service calls.