Are you creating the module yourself in this scenario? I’m curious how you’re using the runtime here. Typically most variables are already observed, so I confess I haven’t thought too much about when this variable should be unobserved. And also module.value is really just intended as a convenience method for when you don’t want to create a bona fide observer yourself, and mostly assumes the variable only has a single value since you’re only awaiting the first value.
So, I think (2) is your best bet. Invoking the observer’s fulfilled a second time is mostly intended, although perhaps it should reject instead of fulfilling with undefined.
You’re welcome to open a pull request to the runtime if you’d prefer some different behavior. Maybe we would need to do some reference counting in module_value? Or more likely, perhaps module_value should create a derived variable that is observed and then delete it after the promise resolves or rejects? Suggestions welcome.