It has nothing to do with "precision comparisons".
item oslk = $item[[1764]Spookyraven library key];
item nslk = $item[[7302]Spookyraven library key];
oslk.to_int() -> 1764
nslk.to_int() -> 7302
oslk == nslk -> false
oslk.to_string().to_item() == oslk -> true
nslk.to_string().to_item() == nslk -> true
Those last two are key; you can convert an item to a string and back to an item and get the same item back.
Which is to say that disambiguated names are important for programs to internally manipulate and convert items.
Your use case is to display the item to the user - not the program. You would like the OUTPUT of the item to be potentially ambiguous. One assumes that you are not worried about user INPUT being ambiguous, because ASH only allows that at program startup.
But, lets consider that. Let's use effects, since they also have a variety of duplicate names. Your program takes a string which is an effect name and tells the user what it will do and how to get it. You use a string since, otherwise, you get a drop-down with 2000 some entries in it.
If the user types "Hip to the Jive", is it "drink 1 Hot Socks" and get "Experience (familiar): +2, Familiar Weight: +10, Familiar Damage: +20" or is it "use 1 baloney rotgut" and get "Avatar: "hep cat""?
KoLmafia chooses the last 1 - and says so, after listing both possibilities - and disambiguates to "[1872]Hip to the Jive".
In any case the intent is that
to_item( to_string( item ) ) == item
and
to_string( to_item( string ) ) == string.
I'm curious to hear your ideas about how to achieve this without disambiguating the string representation of ambiguous item names.