This paper has two contributions. First, it gives a semantics for the iTask workflow management system. Second, it describes an effective methodology to construct such a semantics.Semantics is a formal description of the meaning of language constructs. Just like any other formal description there are umpteen ways of introducing flaws in such a description. Even trained people are not very effective in spotting issues in formal text. In this paper we show that it is very well possible to describe semantics of programming languages using a modern functional programming as carrier of the specification. This enables automatic sanity checks by the language compiler, simulation of the described semantics to validate the specification, and automatic testing of properties of the semantics.We illustrate this technique with the well-known example of simple imperative language as well as the iTask workflow management system. In our experience this methodology works very well. The combination of sanity checks, simulation and automatic testing of properties really helped to construct a trustworthy semantics for the iTask system.