After some back and forth by email, the status line bug has been figured out, and it seems worth recording it here, in case anyone else stumbles over it. It turned out not to be an interpreter bug in the end: it is an Inform library bug.
The problem only showed up when a Blorbed V6 game file was loaded into Frotz: if just the raw V6 game file was loaded, everything was fine. The difference in behaviour was tracked down to byte 1 of the game’s header, which holds various configuration flags. In V6, bit 1 of this byte is set by the interpreter if it thinks that graphics are available and not set if not, so Frotz set it only when the Blorb version of the game was loaded. Hacking the interpreter to unconditionally clear this bit made the bug go away.
Given that and a check of the Z-Machine specification, the bug starts making sense. Back in V3 and before, the interpreter is largely responsible for drawing the status line. In V3 only two sorts of status lines are supported: one showing score and moves, and one showing game time elapsed (for games like ‘Deadline’). Which one the game wants is determined by bit 1 of byte 1 in the header.
When Infocom moved to the V5 format, this bit in the header became redundant, as the screen model allowed the game to be in charge of the status line. However, Inform kept the convention that this bit was used to toggle the Inform library’s implementation of the status line between the score/moves mode and the time mode: this bit is read into the library variable sys_statusline_flag, which is then used to control the behaviour of DrawStatusLine(). Since Infocom didn’t assign any meaning to this bit for V5, this approach of Inform’s didn’t cause any problems.
However, when Infocom moved to the V6 format, they did re-use this bit, re-purposing it to mean whether the interpreter had found graphics data or not. Unfortunately, this wasn’t noticed when Inform 6’s library gained the minimal V6 support that it has: the V6 version of DrawStatusLine() doesn’t support the time mode, but having sys_statusline_flag not set to zero does cause a change in behaviour of DisplayStatus() in parserm.h, which is enough to cause the problems you see.
The correct solution is to edit the library to wrap the setting of sys_statusline_flag in InformLibrary.play() with conditionals so that it doesn’t happen for V6. The simpler solution that avoids changing the library is to just clear the variable in the game’s Initialise function, like so:
[ Initialise;
sys_statusline_flag = 0;