The last method
can only be called when you provide a proof that your parameters pass the requirements of checker, but that doesn't mean you need to actually match on the `oh` constructor. Pattern matching on constructors of inductive families (data types that refine parameters) introduces implicit knowledge about equalities into scope. For example, in Haskell with GADTs:
data Moo a where
Baa :: Moo Int
foo :: Moo a -> a
foo _ = 5 -- this fails
bar :: Moo a -> a
bar Baa = 5 -- this passes
In your case, pattern matching on the `oh` constructor is telling idris that "checker x y` is `True`, but `checker x y` is a complex expression. This would cause Agda great distress, because it would say "you're telling me something is equal to True, but I can't represent that knowledge anywhere in my pattern!! what can I do??"
The Haskell example above would work in Agda too because that universally quantified `a` variable in the type acts like an implicit Set-valued variable, and can be implicitly refined. So if we expand implicits:
bar : {a : Set} -> Moo a -> a
bar {.Int} Baa = 5
where that period in front of `Int` is acknowledging that the value in that pattern is forced by another pattern (`Baa` right after it) to be `Int`.
So what we have is that `Baa` is a constructor that carries a magic equality proof with it, and if we want to pattern match on it, we need to be able to add a dotted pattern as we did above, somewhere in the patterns in scope. If pattern-matching on such a constructor would result in no dots being added anywhere (because the expression in question isn't in scope in the pattern) then Agda will not like it. So Agda would reject your example with `so (checker x y)` for that reason, because `oh` carries the proof that `checker x y = True`, and `checker x y` is not in scope. To bring it into scope, we'd do something like:
dp : (x : Int) -> (y : Int) -> so (checker x y) -> String
dp x y q with checker x y
dp x y oh | .True = udp x y
so the dottedness of the match on `oh` is respected. That is, you're acknowledging that you know that `checker x y` must be true when you pattern match on that `oh`.
Anyway, that's an explanation of the reasoning behind Agda. It's a bit of a design decision, but I imagine similar issues arise in Idris and even if dot patterns are not present (I'm not sure they are?), you're still introducing knowledge about something complex and that can cause trouble.
In your particular case, you can just completely ignore the value (with a wildcard pattern of some sort) of the `so (checker x y)`. You've required that your caller pass it to you, and as long as they do that, you don't really care what's in it because your function doesn't use the proof.