Abstraction Barrier
Abstract data types introduce an abstraction barrier between those who implement a data type and those who use it.
If you are implementing the data type, then you know how its values are represented and are allowed to write code that depends upon that representation.
If you are a user of an abstract data type, then you do not know how its values are represented and you are not allowed to write code that depends upon the representation.
That means the distinction between concrete and abstract data types depends on your relationship to the data type.
If a problem set asks you to implement a data type, then you will know its representation and can rely on that knowledge when you write your tests and define your functions and methods. For you, the data type will be concrete.
When we write black-box tests of a data type we have asked you to design and to implement, we will not know its representation, and our black-box tests are not allowed to depend on any properties or behavior of the data type beyond the properties and behavior specified in the problem set. For the course staff, the data type will be abstract.