4d2bed916d
Every case on a target carrying a document now reads the line through ws.explain before running it, and asserts three things: the dry run records no question, a refusal it predicts is the refusal that arrives, and a refusal that arrives was predicted. The last one is found by looking for one of the document's own rule reasons in what the run printed, and is the direction a prediction cannot check on its own; it is what catches a line explain wrongly calls allowed. Seven cases carry explain_blind with the reason the command plane cannot reach their verdict (a runtime-expanded glob, a refusal from the op door, a function the same line defines), named rather than silently skipped. The battery's three answer words are also a real type in both harnesses now. They were compared as open strings, so everything that was not allow_once fell through to a session-wide allow and a misspelled word passed the case while testing the most permissive answer there is.