anchor.diff:               }
           }
   
  -    let buildCmd (sb : CommandHandler<'TCmd, 'TCommandContext, 'TState, 'TId, 'TEvent,'TMetadata>) : ICommandHandler<'TEvent,'TId,'TCommandContext,'TMetadata> = 
  +    let buildCmd (sb : CommandHandler<'TCmd, 'TCommandContext, 'TState, 'TId, 'TEvent,'TMetadata, 'TValidatedState>) : ICommandHandler<'TEvent,'TId,'TCommandContext,'TMetadata> = 
           ToInterface sb
   
       let addValidator 
           (validator : Validator<'TCmd,'TState>) 
  -        (handler: CommandHandler<'TCmd,'TCommandContext, 'TState, 'TId, 'TEvent,'TMetadata>) = 
  +        (handler: CommandHandler<'TCmd,'TCommandContext, 'TState, 'TId, 'TEvent,'TMetadata, 'TValidatedState>) = 
           { handler with Validators = validator::handler.Validators }
   
       let ensureFirstCommand x = addValidator (StateValidator (isNone id "Must be the first command")) x
  
positive.code:     SetMessageId : Guid -> 'TMetadata -> 'TMetadata
  }
  
  type CommandHandler<'TCmd, 'TCommandContext, 'TCommandState, 'TId, 'TEvent,'TMetadata> = {
      GetId : 'TCommandContext -> 'TCmd -> 'TId
      StateBuilder : NamedStateBuilder<'TCommandState, 'TMetadata>
      Validators : Validator<'TCmd,'TCommandState> list
      Handler : 'TCommandContext -> 'TCmd -> seq<'TEvent * 'TMetadata>
      SystemConfiguration : SystemConfiguration<'TMetadata>
  }
  
  
negative.code:                 return NonEmptyList.singleton (sprintf "Invalid command type: %A expected %A" (cmd.GetType()) typeof<'TCmd>) |> Choice2Of2
              }
          
      let ToInterface (sb : CommandHandler<'TCmd, 'TCommandContext, 'TState, 'TId, 'TEvent,'TMetadata,'TValidatedState>) = {
          new ICommandHandler<'TEvent,'TId,'TCommandContext,'TMetadata> with 
               member this.GetId context cmd = untypedGetId sb context cmd
               member this.CmdType = typeof<'TCmd>
  