book.contains(key) determines whether something is in the module. It assumes that key is a Verse. If it is not it grabs the first verse in the key.
When you give an incomplete specification to VerseFactory.fromString, it assumes values of 0 for missing chapter and verse. So if you specify:
Is that will be Is.0.0 (the book introduction).
Is 53 will be Is.53.0 (the chapter introduction).
It will be these exact values looked for in the module.
VerseFactory only returns a single Verse.
If you had used VerseRangeFactory.fromString, then it would have assumed that
Is is the entire book starting from Is.0.0
Is.53 is the entire chapter starting from Is.53.0
If you passed the VerseRange to the contains method, it would have used the first verse in the range and ignored the rest.
Likewise for using a Passage, it only looks at the first verse.
It does not mean containsAll, it means containsFirst.
In the VerseKey classes contains(Key) means containsAll.
Combine this with the change to allow chapter and verse 0. It explains why it would have worked before. The factory methods would have used 1 for missing chapter and verse. It is a reasonable heuristic to check for the first verse of a chapter.