I have the following two definitions that result in two different error messages. The first definition is declined because of strict positivity and the second one because of a universe inconsistency.

(* non-strictly positive *) Inductive SwitchNSP (A : Type) : Type := | switchNSP : SwitchNSP bool -> SwitchNSP A. Fail Inductive UseSwitchNSP := | useSwitchNSP : SwitchNSP UseSwitchNSP -> UseSwitchNSP. (* universe inconsistency *) Inductive SwitchNSPI : Type -> Type := | switchNSPI : forall A, SwitchNSPI bool -> SwitchNSPI A. Fail Inductive UseSwitchNSPI := | useSwitchNSPI : SwitchNSPI UseSwitchNSPI -> UseSwitchNSPI.

Chatting on gitter revealed that universe (in)consistencies are checked first, that is, the first definition adheres this check, but then fails because of a strict positivity issue.

As far as I understand the strict positivity restriction, if Coq allows non-strictly positivity data type definitions, I could construct non-terminating functions without using fix (which is pretty bad).

In order to make it even more confusing, the first definition is accepted in Agda and the second one gives a strict positivity error.

data Bool : Set where True : Bool False : Bool data SwitchNSP (A : Set) : Set where switchNSP : SwitchNSP Bool -> SwitchNSP A data UseSwitchNSP : Set where useSwitchNSP : SwitchNSP UseSwitchNSP -> UseSwitchNSP data SwitchNSPI : Set -> Set where switchNSPI : forall A -> SwitchNSPI Bool -> SwitchNSPI A data UseSwitchNSPI : Set where useSwitchNSP : SwitchNSPI UseSwitchNSPI -> UseSwitchNSPI

Now my question is two-folded: first, what is the "evil example" I could construct with the above definition? Second, which of the rules applies to the above definition?

Some notes :