16

When SE invalidates votes due to voting irregularities, the script should check whether those votes have caused any posts to be deleted, and undelete them if they wouldn't have been deleted without the invalidated votes.

Phew. That's a mouthful. Let's give an example scenario.

  1. User A posts a question, and it gets an upvote or two but no answer.
  2. Months later, user B gets angry at A (for unrelated reasons) and uses sock-puppets to downvote all of A's questions, dropping that one question's down to 0 or lower. No one notices at the time.
  3. Later, that question gets auto-deleted by Roomba. No one notices.
  4. Eventually, B's shenanigans are discovered and a community manager invalidates B's votes, bringing that question's score back to where it should be (+1 or +2 or so). However, the question was previously deleted and remains deleted, and no one notices.

Unfortunately, it appears that the vote invalidation scripts don't check for this case and thus leave that question wrongly deleted. This allows trolls and users who violate our rules to cause good questions to be deleted, with no one the wiser.

No one is notified when the question is deleted. (As far as I can tell, there's not even anything you can enter into the search bar to find questions that might have been wrongly deleted in this way.)

This has happened at least twice: see here and here. It seems difficult to tell how many other times it might have happened. Hopefully it's rare, but still unfortunate when it does happen.


Feature request: The vote invalidation scripts should automatically check for this situation and undelete any questions that were wrongly deleted by Roomba as a result of the subsequently-invalidated votes.

  • How many posts are we talking about? – rene Jun 13 '16 at 17:56
  • I wonder what the actual "implementation/performance" cost of this would be, but I too see this as something useful. That said, I also think this may be a very edge case, so probably only the devs can tell us if it is something worth considering. Have my vote for now. – SPArchaeologist Jun 13 '16 at 17:59
  • I'd like to add that on some sites, having a question sit for a long time without answers and even with few votes does not per se imply it's bad. It may only be complicated and/or really hard to answer (for instance, open research problems linger on Computer Science). – Raphael Jun 13 '16 at 20:16
  • @rene It's impossible to tell without access to the database. – Raphael Jun 13 '16 at 20:16
  • @Raphael I know hence my post in the tavern where I was happily ignored ;) – rene Jun 13 '16 at 20:19
  • 2
    Didn't exactly ignore you, @rene... It's just kind of a pain to figure this out. I've posted numbers below, but freely admit they're probably much, much higher than what we'd actually want to see undeleted. – Shog9 Jun 13 '16 at 21:17
14

This is super-complicated.

The proper solution here would be to ensure that automatic deletion gives votes time to "age" and be vetted by the fraud scripts before taking action.

Update: The Roomba script now only considers downvotes cast more than two days ago when calculating the question's score, for the purposes of calculating if a post meets the deletion criteria.


FWIW: animuson & I put together a quick and dirty script to see how often this happens. We examined every post that'd been deleted automatically, and re-counted the votes that hadn't been deleted or invalidated. Note that this means we ignored votes that were invalidated by the automated fraud scripts, votes invalidated manually, votes invalidated by user deletion, and votes cast by Community (like those associated with Spam or close votes or VLQ flags) that either age away or can become invalidated due to other votes.

In the entire history of Stack Exchange, 1206 posts would've been affected by this change on Stack Overflow. That's assuming we ran this check for everything that can invalidate votes, including user deletion. The next-closest site on the network was Ask Ubuntu with 259 posts, followed by Math with 196. No other site had more than a double-digit number of posts potentially affected here.

To add to this, animuson observes that on a normal day, the vote fraud invalidations and post-score normalization tasks run before automatic deletion, meaning that any errors here are due to something either breaking one of those initial steps, or vote-fraud that is simply too subtle to be caught by automatic scripts.

Given the complexity involved, and the relative lack of visibility into this process... I think it's safe to say this would probably not do a lot of good, and could potentially break in interesting and frustrating ways without anyone noticing for months.

Let's think about a simpler solution.

  • 2
    While I take your word that it's indeed super-complicated, wonder why. When the script invalidates upvote on post X, can't it just check if post X has been deleted by the Roomba, and in such case undelete? (or throw X into some other queue for further inspection?) – Shadow The Curly Braced Wizard Jun 13 '16 at 19:47
  • Allowing votes to "age" sounds like it'd be helpful for votes that are invalidated by the automatic invalidation script (e.g., that detects serial downvoting), but it won't deal with the case of votes that are manually invalidated by a community manager (e.g., when voting irregularities are detected by a human). Still a partial step forward. Shadow Wizard's alternative approach could presumably apply to both cases. – D.W. Jun 13 '16 at 20:27
  • You're talking about a separate process that simply doesn't exist right now, @Shadow. And you'd want it to actually re-count the votes on each post, not just blindly undelete anything involved. Probably want some sanity-checks here to avoid undeleting spam and such. It's feasible, but it adds a whole set of logic that doesn't exist today to a process that is currently relatively simple, at least when it comes to the changes being made. – Shog9 Jun 13 '16 at 21:05
  • Those are completely separate code paths anyway, @D.W... And the path for deleting votes associated with users who are being removed because they've been identified as sockpuppets is a third one, which is shared with most other user-deletion but has a sorta complicated relationship with the other vote invalidation logic. So no, we wouldn't get anything free here. FWIW, it's fairly easy to get stuff undeleted in those (rare) cases where this is an issue; just flag for mod attention or email us. – Shog9 Jun 13 '16 at 21:07
  • 1
    @Shog9 I tend to agree, but need to keep in mind the impact, even if it's not really common, is big and very negative. Single person can cause, in theory, the deletion of 40 good questions every day. Not a power we want in the hand of trolls. – Shadow The Curly Braced Wizard Jun 13 '16 at 21:09
  • Of course, that can happen without any detectable voting fraud, @Shadow. – Shog9 Jun 13 '16 at 21:10
  • But eventually those are caught and nuked, so better have the damage undone somehow. – Shadow The Curly Braced Wizard Jun 13 '16 at 21:11
  • 2
    Better not to do damage in the first place, @Shadow. None of the automatic deletion scripts are built solely on post score, but to the extent that it matters it should be possible to make it harder to hide. A more robust solution would probably add other, harder to game criteria. The goal should be to reach a point where any errors here are essentially benign, affecting posts that no one cared about anyway. – Shog9 Jun 13 '16 at 21:16
  • 1
    I don't know how long your quick & dirty script ran, but isn't that the fix? Don't try to detect all scenarios whily you change things, but run an (n+1)th phase that checks "Do autodelete criteria still apply?" -- if not, undelete, put into a review queue, or raise a mod-flag. – Raphael Jun 14 '16 at 8:35
  • Another possibility would be to notify users when their posts get (auto-)deleted, but afaik any request in the direction of "please talk to me, SE!" was declined in the past. – Raphael Jun 14 '16 at 8:36

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .