Twitter Reputation
The torrent of terrifying abuse directed at women by “supporters” of Gamergate continues unabated. Social solutions seem far away; in their stead an ecosystem of Twitter reputation tools has taken root.
Two of my favorite tools to date are Randi Haper’s Good Game Auto Blocker, a script that smokes out Twitter ne’er-do-wells by identifying accounts that follow too many ringleaders1, and Jacob Hoffman-Andrews’ Blocktogether, a community blocklist service. The two play nicely together. For example, Randi regularly runs her script with a Gamergate-focused input set and publishes the results as a public blocklist. After an update, list subscribers automatically block any newly identified miscreants2.
I’m excited about the future potential of this ecosystem. We’ve seen reputation systems for Twitter and other social networks before, but they’ve tended to be centralized and of questionable value. We’ve seen webs of trust before, too, particularly in public key cryptosystems like PGP, but they’ve tended to be hard to reason about and maintain. And we’ve seen systems for community SPAM prevention, but historically they’ve tended to be the domain of system administrators rather than the general public. Good Game and Blocktogether feel like genuinely new entrants, blazing fruitful trails while remaining eminently pragmatic.
Where might we go next? As with any young ecosystem, these new tools have fuzzy boundaries. For example, at the moment both Good Game and Blocktogether have corners that define and implement reputation ranking. Good Game has its ringleader algorithm; Blocktogether lets users autoblock accounts that are too young or have too few followers.
Donning my architecture astronaut cap, there seems to be a need to declare and reason about sets of users in the abstract. With a small but carefully crafted reputation language we might be able to quickly express our intuition about who is “bad”3:
idiots = [@badguy1, @badguy2]
sheeple = multiple([idiot.followers for idiot in idiots], 2)
stalkers = intersect(sheeple, @me.followers)
dubious = [follower for follower in @me.followers \
if follower.followers.count < 15]
goodbye = union(stalkers, dubious)
This small bit of handwavey code4 captures the reputation behavior of both Good Game and Blocktogether. Primitives like follower, following, mutual, etc. seem natural to include as core language concepts. That said, we shouldn’t go too far: one of the strengths of the current crop of tools is their straightforward pragmatism.
Now that we have a way to declare reputation algorithms, we need a reputation engine. This will take our policy declarations and produce from them concrete lists of Twitter accounts. Our engine will need to confront Twitter API limitations and may need multiple code paths to support both one-shot and continual modes of execution.
These two pieces give us the tools we need to make our blocking service cleaner and more powerful. Our service will still need to handle the complexity of queueing the right set of actions to keep Twitter accounts in the expected state — quite a bit of work already, nicely separable from the rest.
Architecture astronautics aside, the most exciting news in this emerging ecosystem is that Randi has decided to go full-time on her Good Game project. She’s spun up a Patreon to pay her salary: if you’d like to see more and better reputation tools built, go donate to Randi today!
[1] Randi’s script calls them idiots and the people who follow too many of them sheeple. Sheeple who follow your personal account are stalkers to be banished.
[2] Interestingly, Blocktogether will also unblock stalkers that have subsequently been granted leniency. To prevent nasty surprises, actions taken directly on Twitter are prioritized over those on Blocktogether. For example, accounts directly blocked via Twitter are never unblocked by Blocktogether itself.
[3] There’s no requirement about the meaning of our reputation list; meaning is entirely user-defined. Gamergaters could quite happily use these tools to block accounts that they find reprehensible; others could use them to identify new accounts to follow rather than block.
[4] Really, really handwavey. I use the word “declare” because I think any reasonable language would be a declarative one. In this post, I’ve instead used a pseudo-functional pythonic frankensyntax. I apologize in advance.