In nullResultSet is defined like this:

// Empty ResultSet to return when response is falsy (null|undefined|empty string)        
nullResultSet: new{            
    total  : 0,            
    count  : 0,            
    records: [],            
    success: false        
The problem is that the has the following code:

if (isArray && !data.length) {
    return me.nullResultSet;         
that causes nullResultSet to be returned not only in cases specified above, but also for empty arrays. Because nullResultSet has success flag set to false, it causes the whole response to be incorrectly marked as failed.

BTW. I can fix it myself, but currently there's no way to contribute to Sencha Touch, right? Any plans to use GitHub or something similar for hosting Sencha Touch code?

Here's how I fixed it (touch/src/data/reader/Reader.js)

         if (isArray && !data.length) {
-            return me.nullResultSet;
+            return new{
+                total  : 0,
+                count  : 0,
+                records: [],
+                success: true
+            });