requireValueInRange vs requireValueInList — the actual difference
The DataValidationBuilder gives you two dropdown methods and the distinction is not cosmetic. requireValueInRange(range, showDropdown) stores a reference to the range object — it resolves that reference each time a user opens the cell, so adding a row to your Options sheet is reflected immediately. requireValueInList(values, showDropdown) accepts a plain array of strings and bakes them into the rule at the moment you call build(). The list is frozen from that point forward.
This is why dropdowns built by a script 'stop updating': whoever wrote the script used requireValueInList, passed it the current values, and the rule has no idea the source sheet changed. I have watched this bite every team that migrates their dropdown management from the UI to a script without reading both method signatures carefully. The UI's 'List from a range' option maps to requireValueInRange; 'List of items' maps to requireValueInList. Match the method to your intent.
The second argument to requireValueInRange is a boolean that controls whether the dropdown arrow is shown in the cell. Passing true matches the default UI behavior. Passing false still enforces the rule — the user just has to know to type a valid value, which is almost never what you want.