"real" R*Tree corruption is the one explained here:
http://www.gaia-gis.it/spatialite-2.4.0-5/SpatialIndex-Update.pdf
but this doesn't seems to be your case.
So I strongly suspect this is a really subtle and
completely different problem.
The SQLite's own documentation is really clear:
http://www.sqlite.org/rtree.html
the R*Tree internally stores any coordinate as 32-bit
floating point numbers (aka single precision).
but SpatiaLite stores any coordinate as 64-bit
floating point numbers (aka double precision).
Some rounding or trumcation occurs for sure:
happily enough, it's usually so small to be
quite unnoticeable.
A shart tale of mine: I become quite crazy to identify the
cause explaining such "odd" issue the first time a sample
"missing one feature in several millions" was submitted
to my attention few weeks ago.
And at the end of this defatiguating debugging session
I duly discovered that it simply was due to some adverse
truncation side effect.
Resolving this issue is absolutely trivial: you simply
have to *enlarge* a little bit your query BBOX by a
quite infinitesimal amount, so to recover for any
possible undesired numeric rounding/truncation.
A little "curiosity": just by hazard I had some weeks
ago an interesting conversation with one of the PostGIS
developers.
So I learnt that PostGIS as well has to face this same
identical problem: 64 bit "double" values for Geometries,
but only 32 bit "single" values for the GIST spatial index.
And the PostGIS solution is exactly the above one:
they "silently" enlarge the query bounding box passed by
the user before actually searching into the GIST Spatial
Index :-)
bye Sandro