<@U71V6G2PDJS> - what <@U78EF4XFY8W> said. (I would also consider @gpassero’s approach)
I have been finding it helpful to think about this in terms of types (let’s say sorbet). If you were to type the ID, what would it be? A number? Or Id? Or a UserId? The latter would give you similar protections to what Oskar is proposing. The next question becomes where to define the type. If you define it in the user package, you’re back to having a dependency on that package. As an alternative, you could use dependency inversion and define the UserId in a UserTypes package, which both you notes and users packages depend on. Now you can see the stable abstractions in your codebase