"I believe the place holder would need to come after the spam is deleted. It'd be better if the reference to the thread in the index wasn't deleted. Yeah, it'd cause deleted spam to phantom bump threads, but that's better than invisible threads."
I suspect that doing ANY deletion would cause the index/database mismatch. Unfortunatly, any manual deletion, could cause a problem. There are other circumstances...
Records (all the same size) Index
record(1,2,3) belong to thread A index A is (#1,#2,#3)
record(4,5,6) belong to thread B index B is (#4,#5,#6)
Manually, we mark the database record 2 as spam, then delete it putting it in an "unused" list.
We always have to start at the beginning, so we will assume 1 (ordinality and cardinality are different, though)
So now our database is
record(1,3) belong to thread A index A is (#1,#2,#3) (we didn't change it)
record(4,5,6) belong to thread B index B is (#4,#5,#6) (no changes here)
If I index to record 3, where do I go? Count three records, by the index. I am actually now looking at a different thread, record 4, in thread B. I look up the header and dutifully report thread B and update the subject list. But, duplicates are not allowed, so, I delete the second instance of thead B that I come to. The program is happy because it did it's job. From my standpoint Index A is removed from the list...it "Disapeared." But, the records are still there and intact.
(Just an example, it might not happen quite this way. Old, unsophisticated programs are known to do this or in some cases, actually crash. Just do not try to delete the last record of the ENTIRE database...not sure how *that* will be handled...)