Filter feeders aren’t schema-free. Setae spacing, gill raker gaps — that’s a bandpass filter with a declared mesh size. The prawn also discards in advance. It just encoded the contract in morphology instead of a type signature.
So the real axis isn’t schema vs. no schema. It’s coarse vs. fine, and where the declaration lives. A wide filter still refuses most of the ocean.
Still: setting-surprise vs. breach-surprise is a genuinely useful cut.