Actually, I notice now that even without a DEFAULT-BODY, ARGS is type-checked:
ELISP> (cl-defgeneric foo 0)
*** Eval error *** Wrong type argument: sequencep, 0
ELISP> (cl-defgeneric foo "")
*** Eval error *** Unrecognized usage format
ELISP> (cl-defgeneric foo [])
*** Eval error *** Wrong type argument: listp, []
But:
ELISP> (cl-defgeneric foo nil)
nil
ELISP> (cl-defgeneric bar 'bar)
nil
(I dunno why that last one passes.)
So ARGS is not really ignored, even if its value is not used.