The new, nicely formatted blame messages helped me discover that every single Redex contract has the wrong negative party. (Admittedly, the commonly used Redex provides are macros.) There are two problems.
I believe the first is a bug. The following program (module dependencies DAG: http://pastebin.com/u9KMTnuP) blames d.rkt, even though the abused function never passes through its hands. a.rkt: #lang racket (require "b.rkt") (f 3.5) b.rkt: #lang racket (require "c.rkt" "d.rkt") (provide (all-from-out "c.rkt")) c.rkt: #lang racket (require "e.rkt") (provide/contract [f (-> integer? integer?)]) d.rkt: #lang racket (require "c.rkt") e.rkt: #lang racket (define (f x) x) (provide f) The second problem is that, AFAIK, there's no convenient way to define a module b that combines the provides of two modules c and d. If b requires c and d and provides values f and g using `all-from-out', then b, not the module that requires it, becomes the negative party on the f and g contracts. a.rkt: #lang racket (require "b.rkt") (f 3.5) b.rkt: #lang racket (require "c.rkt" "d.rkt") (provide (all-from-out "c.rkt" "d.rkt")) c.rkt: #lang racket (define (f x) x) (provide/contract [f (-> integer? integer?)]) d.rkt: #lang racket (define (g x) x) (provide/contract [g (-> string? string?)]) _________________________________________________ For list-related administrative tasks: http://lists.racket-lang.org/listinfo/dev