That’s part of the solution, but it looks like there’s another complication in the fact that the hat is on a supporter. By default, Inform does not print initial appearances of things that are on supporters.
There is a solution for changing the behavior of containers and supporters, but it’s wordy, and as far as I know there’s no extension that quite does it (although you might look into Room Description Control.)
However, in your case, since the hat is fixed in place, it seems like the simple solution would be this:
[code]The table is in The Stage. “A table stands in the middle of the stage.[paragraph break]A wide-brimmed, black top hat is on the table.”. The table is fixed in place.
A magic hat is scenery on the table. The hat is an open not openable container.[/code]
Inform will not print what is on supporters, if it knows that those things have already been mentioned.
The table is in The Stage. The initial appearance of the table is "A table stands in the middle of the stage. A wide-brimmed, black top [hat] is on the table.". The table is fixed in place.
That will print “black top magic hat” rather than just “hat”, because “magic hat” is the full name of the hat. You can fix that by renaming the magic hat (calling it “hat” merely) or by giving it the printed name “hat”.