Inform has some funky I6 code to guess whether to print “a” or “an”–it evaluates the string it’s going to print, looks at the first character to see if it’s a vowel, and prints “a” or “an” based on that. (I think this is the PrefaceByArticle routine.) Some background here and my code starts here.
I have some code that’s designed to provide a hook into I6 so you can run your own code to figure out whether the article should be “a” or “an,” which would allow you to program in exceptions for words like “hourglass” and “uranium,” but last I checked IIRC it would occasionally put in line breaks where they shouldn’t be. Overloading the reset the article phrase is probably a good idea! Though you’d also have to do it When Play Begins.
Another thing you could do is give some things a default indefinite article property, and in the reset the article phrase you could check to see if the item has a default indefinite article, and if it does set the indefinite article to that.
One thing about the indefinite article is that, if it can appear in sentence-initial position, you want to check whether your hand-rolled indefinite articles are getting capitalized properly. (I think some of the default Inform messages may have been designed not to put indefinite articles in sentence-initial positions because Inform didn’t always handle capitalized indefinite articles. I wouldn’t at all be surprised if part of the reason you get “box (open)” rather than “open box” is that Inform used not to be able to look ahead and check whether the first letter of the thing it was about to print was a vowel.)