<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.5">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2024-02-28T14:25:22+00:00</updated><id>/feed.xml</id><title type="html">meowch ado about nyathing</title><subtitle>esoterica and ponderance from a sand cat's view of the world</subtitle><entry><title type="html">I can’t feel</title><link href="/2024/02/27/i-cant-feel.html" rel="alternate" type="text/html" title="I can’t feel" /><published>2024-02-27T00:00:00+00:00</published><updated>2024-02-27T00:00:00+00:00</updated><id>/2024/02/27/i-cant-feel</id><content type="html" xml:base="/2024/02/27/i-cant-feel.html"><![CDATA[<p>Nearer the start of the most recent conflict in Israel and Palestine, I was
horrified and felt a tremendous animating force in me to do what I could to
make it known that none of this was in my name. I took to the streets, I
organised with my union, I sung with my Arab sisters, brothers, and others. I
proudly stood and demanded a ceasefire, with some vague hope that this all
must stop at some point, right?</p>

<p>This post is going to get rapidly brutal and graphic. Consider this to be a
content warning, if you need one.</p>

<p>Over the few months that followed, I saw tragedy after tragedy. I saw the
videos of the pure visceral devastating aloneness and fear in the eyes of
children who were in the immediate aftermath of their parents being
killed in front of them. Children too young to know to whom they prayed or
why, screaming for God to hear them. I watched children cling to whichever
adult was closest to them, usually a blood-stained doctor in a hospital,
because they had just had everything they knew of their life ripped from them,
by the most advanced weapons in the world falling from the sky over them,
whose explosions tore through their house and their family. I saw very young
sisters forced into the position of holding their slightly-younger brothers to
them to try to reassure them, when neither of them understood why they were
suffering this, neither of them knew what would happen next, and neither of
them had anywhere near enough emotional development to even begin to work
through violently, loudly, chaotically, instantanously losing everything,
including their parents.</p>

<p>I saw fathers screaming and crying, trying to dig through rubble with their
bare hands, yelling out the names of the children they knew had been crushed
and killed after their home collapsed after being directly hit by an Israeli
bomb. The fathers must’ve known their kids were gone, they must’ve known their
efforts were in vain, they must’ve known the lights of their lives had been
taken already. I watched the panicked and desperate digging of pure fatherly
instinct turn into a weeping so uncontrollable that their ability to try to
dig started to fail them, until they collapsed into a defeated and destroyed
pile, screaming up to the sky for God to hear them.</p>

<p>I saw people with limbs missing. I saw mothers carrying the only remaining
pieces of their children in bags. I saw mothers collapsing in the street,
screaming for God to hear them, upon being told that their child had been
brutually and carelessly murdered by bombs big enough to level a whole block.
I saw people with nothing but scars and the knowledge of how many funerals
they have not yet had the opportunity to have walking down dirt roads
desperately attempting to reach the safe zones promised to them by Israel, in
hopes of some amount of peace, some amount of time to mourn, some amount of
time to find some sort of reason to live, among piles of blood and corpses
rotting under concrete. I saw those safe zones get bombed.</p>

<p>I watched every new event, every new tragedy, and each time I said to myself
“if this doesn’t change the situation, what will?” Each time I said to myself
“if this doesn’t cause a unilateral public backlash over here, what will?” I
watched as my Government explained why those traumatised blood-soaked children
were actually just too complicated for me to understand and we must continue
supporting and arming Israel. I watched as kind and caring people around me
said “it’s so awful what’s happening over there” as they went about their
normal business.</p>

<p>I became numb. I still attended every march I could, I flyered events, I did
speeches just because I knew this was important even though I could no longer
empathise with those children, those fathers, those mothers. I knew I had to
do something, I had so many luxuries, and they been wounded and maimed and
killed with so little to their name. It’s easy to defend myself here; if I
thought about this stuff all the time, I would never get anything done, and if
I got nothing done, I would not be out on the streets protesting. Many would
insist that it’s a natural and predictable response that humans respond to
trauma by shutting down their ability to feel things, but in the last couple
of days, I have snapped. Maybe it was Shaun’s Palestine video, maybe it was
the news about Aaron Bushnell, maybe it was just a matter of time, but
something has caused these images and news stories to cut me deeper than they
ever have before. Although my heart has grown too callous to imagine what the
suffering feels like, I am aggrevated by the hole blown right through my
humanity.</p>

<p>Elijah himself and the roar of the river Jordan would struggle to wash away
the sin that has now fallen on all of us. When this is all over and people are
picking pieces of skull and brain and connective tissue out of the mangled
piles of concrete and rebar and bomb shrapnel to try to rebuild Gaza, I am
going to look inside myself and find nothing but ferocious disgust and
unbearable shame. In a way, I did this. In a way, we all did this. The
shrapnel embedded in those civilians and their homes was paid for by my taxes.
I killed those Gazans. I sit on a throne of private healthcare, underfloor
heating, Uber Eats deliveries; The Gazans lay dead, pieces of their bodies
strewn across streets the kids once played on. The markets, the places of
worship, the cafes, all the places where in the midst of occupationary
deprivation a people who refused to die celebrated and enjoyed what little
they did have and built loving community with their neighbours while Israel
was given international cover to choke and drought and starve them, are now
soaked in the blood of anyone that got in the way of the bomb.</p>

<p>I am angry at Israel, I am angry at my Government, I am angry at Joe Biden,
but worst of all I detest myself, and I detest my fellow countrypeople. I know
the story of how we got to this point is important to some people, but I
can’t find it in myself to think about that right now, and I insist we do not
have time to endlessly discuss it. How we got here has no impact on the
viscious moral transgression that is happening in Gaza, and the fact that it
needs to stop now, and the fact that it should never have been allowed to
happen. I know some will say that understanding how we got to this point is
vital to what happens next but what happens next isn’t just a question of what
happens to the people of Palestine, but also a question about how we live with
ourselves elsewhere in the world. The global power structures of today lay
dilapidated and exposed on the floor. My soul and your soul now have a rot
deep inside them. There is a stain on any principles we ever claimed to have
that declares them to have been lies. I hope for your sake that you have a way
to find a comfort in repentence for what we have let happen, because I do not.</p>

<p>If you have not yet stood up to demand a ceasefire, what is it going to take?
In a thousand lifetimes we would never be able to adequately apologise to the
Palestinians for the machinations of global politics that permitted this, nor
apologise for the fact that we did not do everything within our power to stop
it, but you, reader, and I, can take to the streets and not let our rulers
have a single moment of peace until this stops, while there are still
Palestinians alive for us to try to apologise to.</p>

<blockquote>
  <p>Many of us like to ask ourselves, “What would I do if I was alive during
slavery? Or the Jim Crow South? Or apartheid? What would I do if my country
was committing genocide?”</p>

  <p>The answer is, you’re doing it. Right now.</p>
</blockquote>

<p>~ Aaron Bushnell, 2024-02-25</p>

<p><a href="https://donate.unrwa.org/">https://donate.unrwa.org/</a></p>]]></content><author><name></name></author><category term="palestine" /><summary type="html"><![CDATA[Nearer the start of the most recent conflict in Israel and Palestine, I was horrified and felt a tremendous animating force in me to do what I could to make it known that none of this was in my name. I took to the streets, I organised with my union, I sung with my Arab sisters, brothers, and others. I proudly stood and demanded a ceasefire, with some vague hope that this all must stop at some point, right?]]></summary></entry><entry><title type="html">Bluesky’s user safety situation</title><link href="/2023/05/02/bluesky-user-safety.html" rel="alternate" type="text/html" title="Bluesky’s user safety situation" /><published>2023-05-02T00:00:00+00:00</published><updated>2023-05-02T00:00:00+00:00</updated><id>/2023/05/02/bluesky-user-safety</id><content type="html" xml:base="/2023/05/02/bluesky-user-safety.html"><![CDATA[<p>The new kid on the block for microblogging is a platform called <a href="https://blueskyweb.xyz/">Bluesky</a>,
and I’ve been thinking about how user safety intersects with its unique
circumstances.</p>

<p>I won’t be occupying myself with whether this platform or the <a href="https://atproto.com/">protocol</a> it
is built on fills a niche not already filled by other options. It exists,
people are using it, and we’re going to need to have frank conversations about
user safety on it regardless.</p>

<p>I’ll lay my cards on the table early. I’m optimistic about Bluesky and the
motivations of the team working on it, but I’m also realistic. All I really
have to go on is the documentation provided by Bluesky so far and their stated
intent for the future, but they could change their minds on any of it.</p>

<p>Throughout this post, I will be discussing the good and bad parts of Bluesky,
both as the invite-only walled garden it currently is, and as the federated
platform it promises to be.</p>

<h2 id="conceptual-brass-tacks-good-things-difficult-things-and-my-suggestions">Conceptual brass tacks: good things, difficult things, and my suggestions</h2>

<h3 id="not-much-metadata-on-remote-users">Not much metadata on remote users</h3>

<p>There’s an extremely glaring downside to abuse mitigation capabilities in
decentralised social systems. Centralised systems like Twitter can benefit
from user metadata when detecting ban evasion; user agents, source IP
addresses, choice of email provider, etc. But in a decentralised network, you
do not have this metadata for users on other homeservers. What this
practically means is you will need to end up using the metadata you <em>do</em> have,
such as what homeserver a user is federating through, how they choose their
handles, who they interact with, etc.</p>

<p>The way <a href="https://joinmastodon.org/">Mastodon</a> and <a href="https://matrix.org">Matrix</a> tend to handle this shortcoming is
defederating homeservers that seem to be the source of many abusive users. It
ends up being a game of “if you don’t keep your house in order, we will ignore
your house.” This works, and I hope Bluesky ends up leaning on this, and I
hope they end up surfacing the ability to mute/block all users from a given
homeserver to end-users as well as homeserver admins. The one problem with
this methodology on Bluesky (compared to Mastodon) is moving your account to a
new homeserver has almost no friction. The way I foresee solving this is
something like “mute every user whose account was initially registered on a
given bad homeserver.”</p>

<p>Corollary to the above: if there’s a homeserver that becomes too big to
defederate, like mastodon.social is on Mastodon, they <strong>must</strong> ensure their
users are roughly reputable. If a homeserver is too big to defederate and
they’re a source of a lot of abusive users, the network will become unusable.</p>

<h3 id="keeping-your-own-house-in-order">Keeping your own house in order</h3>

<p>In existing federated networks, like email, Mastodon, and Matrix, homeservers
function as a user’s entrypoint to a network. There’s far fewer homeservers
than there are users, and homeservers are the only people that know all of the
possible metadata about the clients transiting data through them. This means
that you, a homeserver admin or an end user can pass judgement on the quality
of remote homeserver’s users by empirical evidence, decide that they are not
doing enough work to prevent people transiting abuse through them, and then
reject everything coming from them.</p>

<p>Abusive users <em>can</em> find new homeservers to pass their abuse through, and you
<em>will</em> play a game of cat and mouse to weed bad homeservers from your view of
the network, but email has been doing this for decades, and it <em>mostly</em> works.</p>

<p>This is only necessary for homeservers that are very permissive with new
registrations. A homeserver can ban a remote user without deferating the whole
homeserver but if a given user is repeatedly making new accounts on a remote
homeserver, you will <strong>need</strong> to treat all users of that homeserver with
suspicion. Something I would urge people to keep in mind in this area is
there’s no technical limitation stopping you from saying “mute any user from
homeserver $foo that I have not already seen before.”</p>

<p>Homeservers <strong>must</strong> employ baseline industry-standard methodologies for
pruning abuse from themselves if signups to them are open to the world or face
ostracism. Monitor signups, prevent the most obvious cases of registering many
different accounts for abuse, detect behaviour that looks like spam, etc.</p>

<h3 id="batteries-need-to-be-included">Batteries need to be included</h3>

<p>The Bluesky team have, encouragingly, been preaching about giving users the
tools needed to carefully curate what they see on Bluesky by use of
<a href="https://blueskyweb.xyz/blog/3-30-2023-algorithmic-choice">first-class support for custom feed algorithms</a>. This is a good idea, but
it needs to be implemented with the understanding that if new users see nazis
all over Bluesky when they don’t yet have custom algorithms, Bluesky will have
terrible retention of new users.</p>

<p>The way Mastodon approaches this is your homeserver admins lay down a baseline
of content curation by defederating known bad homeservers on the network. An
advantage Bluesky has in this situation is they’re happy for the bsky.social
homeserver to be the common entrypoint to the network for new users, so they
have a lot of power to shape the first view of the network that new users get.</p>

<h3 id="invite-tree-reputation">Invite tree reputation</h3>

<p>Bluesky is currently invite-only and the dev team are leaning hard on this to
stem the flow of abusive users. This methodology is surprisingly effective:
you can find the people inviting the people that are abusing other users and
prevent from them inviting more people. Private torrent trackers have been
relying on this for decades. The (small) problem with this is that you cannot
be sure that the 54k people you currently have are handing out their invites
wisely. A sufficiently motivated abusive user may prove adept at finding new
ways in, especially when invites are being given to existing users so readily.</p>

<p>Once federation lands, this is of limited use. You can use this methodology to
keep your own house in order, and encourage other homeservers to use it to
keep their houses in order, but this does nothing to protect your users from
remote users on homeservers that do not use this. Even if a remote homeserver
were to try to communicate their invite tree to you (<strong>bad idea!</strong>), they can
simply lie about their invite trees.</p>

<h2 id="current-real-problems">Current real problems</h2>

<h3 id="its-still-in-beta">It’s still in beta</h3>

<p>Some using the platform now are using it as if every <em>important</em> detail has
been worked out, and I can understand why. At the time of writing, there’s
just over 54k users, including some very big names. The fact that some big
things are still being worked out is not always glaringly obvious.</p>

<p>Notably, it was only a few days ago that the Bluesky dev team had to drop
everything they were doing to land the ability to <a href="https://github.com/bluesky-social/atproto/pull/922">block other users</a>. This
feature was implemented with a detail (that blocks are publicly viewable data,
more on this later) that has been widely criticised. I’ve also been led to
believe that the ability to deactivate accounts also had to be quickly
implemented in response to someone needing to be deactivated. Whether or not
this is true, it’s definitely true that they’re building a plane’s engine
while the plane is hurtling through the sky and they’re quickly growing to a
size where user safety is becoming urgent.</p>

<p>Other shortcomings include; muted words are not supported, locked accounts are
missing and might take quite a while to implement (for technical reasons), you
cannot hide replies, reporting categories are limited, etc, etc.</p>

<h3 id="speech-vs-reach">Speech vs Reach</h3>

<p>Something we’ve also seen <a href="https://twitter.com/elonmusk/status/1598752139278532610">Twitter say</a> a number of times recently is that
harmful content can (and should) be allowed to exist but should have its
ability to reach other users limited. It seems the brunt of the argument in
favour of this is that freedom of speech means people should be allowed to say
whatever they want but Twitter as a platform doesn’t have to help deliver
everything you say to a wide audience. Looking at what <a href="https://atproto.com/guides/overview#speech-reach-and-moderation">documentation</a> is
available and reading things the Bluesky devs have said makes it apparent that
they plan to lean into this angle too.</p>

<p><img src="/assets/img/1a5875f17ade6c96c35a1db6acb589f6389ae427.png" alt="image" /></p>

<p>While the above does seem promising, the wording of it does leave something to
be desired. It’s conjecture, but my feeling so far is that Bluesky would like
to manage as many things as possible only by limiting reach, and only resort
to things like account deactivation in extenuating circumstances. Please,
<strong>keep your own house in order.</strong></p>

<p><strong>This being said</strong>, there’s a big difference between users posting bad
opinions, and accounts posting opinions that, when taken to their inevitable
conclusion, amount to fascism, or users that are going out of their way to
harm the mental health of other users, especially those in at-risk
demographics. This is a hard balance to strike; sometimes it is hard to know
what should be considered reasonable debate, and what should be considered
beyond the pale. Hire people that know this difference.</p>

<p>This topic, like many others here, is complicated by federation. If a remote
user is being a bastard, you have two options: refuse all content from the
user, or label content from the user based on what bastardy thing it is. You,
as a homeserver admin, can opt to hide the labeled content for your users, or
you can leave it up to your users. It is currently unclear what the
bsky.social homeserver plans to block for you and what it plans to leave up to
you.</p>

<p>You, as a homeserver admin, can’t opt to simply refuse bastard posts from a
remote user. You can only validate the authenticity of a given post by knowing
the posts from the author that came before it, so if you refuse one post, you
can no longer validate any posts that come after it. This doesn’t practically
matter in most cases: if you label their bastardy posts and don’t show them to
users, that’s mostly fine. A problem occurs if a user posts something illegal
that you cannot tolerate persisting anywhere, but their feed is otherwise fine
(imagine their account is briefly compromised, or so.)</p>

<p><img src="/assets/img/ef8a0aac4f3eef1a23d3e0873f617494515761ff.png" alt="image" /></p>

<p>I am hoping that bsky.social intends to deactivate accounts using bsky.social
as their homeserver if they fall into the “Political Hate-Groups” category,
but there has thus far been some instances of things like harassment,
transphobia, and racism that have not been acted on as fast as one might hope,
and I hope this is a symptom of problems happening faster than they can be
solved rather than a deliberate choice of “limiting reach.”</p>

<p>On the off chance that this is a case of “limiting reach” as a means to avoid
more forceful actions, I’d like to make a few points about the limitations of
that methodology:</p>

<h4 id="speech-means-nothing-if-no-one-can-hear-you"><em>“Speech means nothing if no one can hear you!”</em></h4>

<p>Making a distinction between freedom of speech and freedom of reach seems
dubious at best. If you force a racist into a room on their own so no one can
hear them, they’ll inevitably argue that they are not being afforded freedom
of speech, so this doesn’t feel like it helps at all.</p>

<h4 id="freedom-of-speech-is-for-governments-not-social-media">Freedom of speech is for governments, not social media</h4>

<p>The goals of freedom of speech were, and should be, only the freedom to
criticise your government without fear of retribution.</p>

<p>I come from Europe which, by and large, understands that freedom of speech
does not extend to you being able to intentionally offend people without
consequence, but is a backstop designed to prevent a government imprisoning
you for disagreeing with them. It seems to me that The United States of
America has in recent times dominated international discourse about this
topic, where many believe that you should, in fact, be allowed to be racist
without facing consequences.</p>

<p>There’s definitely a lot of nuance here. If a government bought in draconian
surveillance to detect their citizens being racist, you really should be
afforded protections enough to criticise such a policy but you can very easily
criticise such a policy without yourself being vocally racist.</p>

<h4 id="people-will-find-the-content-anyway">People will find the content anyway</h4>
<p>Anything short of making that content entirely inaccessible will mean people
will eventually find it. This will contribute to your platform <em>feeling</em>
unsafe to certain people, and will likely lead (rightly or wrongly) to a
<a href="https://en.wiktionary.org/wiki/Nazi_bar">nazi bar</a> PR problem.</p>

<p>You can make all the technical and philosophical explanations you want; if
people don’t feel comfortable knowing there’s nazis in the same room as them,
“but you can’t see them” isn’t a particularly potent salve.</p>

<h3 id="algorithms-all-the-way-down">Algorithms all the way down</h3>

<p><img src="/assets/img/034fd1befcc3e4ced4f91bd182a34378705fe8eb.png" alt="image" /></p>

<p>So far it seems that a number of problems in this sphere have been met with
“we can solve that with AI-automated content labeling”, or “you’ll be able to
curate your feed with custom algorithms!”</p>

<p><img src="/assets/img/35ed930ebe58a83e34b3ebe32c9c128487a4a4b3.png" alt="image" /></p>

<p>Again, I can understand this refrain, but I’m unconvinced that this Technology
is developed enough to sufficiently handle user safety in the medium term, and
I’m acutely aware that a future plan for algorithms and AI does not solve the
fact that there are blossoming problems <em>right now</em>. People in at-risk
demographics are currently using Bluesky quite heavily.</p>

<p><img src="/assets/img/09a4dfbaa7cf2d7bf9c47847230d13c598599198.png" alt="image" /></p>

<p>AI-automated content recognition, in the current real world, can only
practically be relied upon to pick low hanging fruit. You are going to need a
thorough and well-tooled team of humans handling everything else, and while I
respect that the dev team has been able to do so much with so few people, I
can feel that an inflection point is <strong>rapidly</strong> approaching.</p>

<h3 id="almost-everything-is-public">Almost everything is public</h3>

<p><img src="/assets/img/52319dc212b2c28fc6d684c0b0400c2c147405dc.png" alt="image" /></p>

<p>In the last few days Bluesky had to urgently implement the ability to block
users. The app launched with the ability mute other users but not the ability
to block other users. The key difference between blocking and muting is that
blocked users will know they are blocked, and their clients can attempt to
prevent them from composing posts that mention or reply to the user that
blocked them. Additionally, mutes only hide notifications from muted users,
while blocking will also hide the blocked user from timelines, but this is an
implementation detail that <strong>could</strong> be changed.</p>

<p>The explanation (to the best of my knowledge) for why blocks are public is
twofold: Bluesky plans to be a federated network, so a remote user’s
homeserver needs to know if they’re blocked or not, but also if users can
seamlessly move from one homeserver to another the new homeserver also needs
to be cognizant of blocks. If I block you while I’m using bsky.social but then
you move to jesopo.uk, it’d not be great for you to magically become
unblocked. Corollary; if I block you while you’re on bsky.social, bsky.social
will tell you that you can’t mention me, and it would not be great if you
could then move to jesopo.uk, without having to make a whole new account and
social graph, and suddenly be freely permitted to mention me, even if my
homeserver will still not show me you mentioning me.</p>

<p>Mutes on the other hand are not public; they solely function to hide the muted
user’s content from the muter. I’m unconvinced that the explanation for blocks
being public is convincing enough that I’m willing to overlook how damaging
public block lists can be to people. You could argue that given the target of
your block on Twitter can already see that you’ve blocked them, they can
already send a dogpile after you, but this does make that easier.</p>

<p>Additionally, as currently implemented; every post, follow, like, etc is
accessible from unauthenticated APIs, and every change to publicly accessible
information anywhere on the platform is able to be streamed through an
unauthenticated websocket endpoint on the API. One might argue that this is
necessary for federation, but the <a href="https://atproto.com/guides/overview#achieving-scale">docs disagree</a>. From a purely
theoretical standpoint, one <em>could</em> do what mastodon does: only inform a
remote homeserver about a new post you make if they have a user that follows
you.</p>

<p>This all leaves Bluesky wide open to mass data archival without user consent.
This is a topic Mastodon has been struggling with a lot and they have opted
to (mostly) solve it by <a href="https://docs.joinmastodon.org/admin/config/#authorized_fetch">Authorized Fetch</a> which requires an entity
requesting a record to identify themselves. Some may say “if you post
something publicly, you consent to it being archived!” but many, myself
included, believe there’s more than just public and private content. Sometimes
you want to be findable but not have the spotlight on you. If you are a public
figure, assuming anything you post in public is going to be archived makes
sense, but if you’re just some random user trying to have a good time, it can
feel like an invasion of privacy.</p>

<h3 id="deletes-are-git-reverts-at-the-moment">Deletes are git reverts, at the moment</h3>

<p><img src="/assets/img/79aee9442f4aef11ede0a0a3be8ccb9f4e949b03.png" alt="image" /></p>

<p>When you delete a post, or undo a follow, or undo a like, etc etc it currently
simply adds a “I’ve deleted that” event to your repository. If someone knows
where to look, <strong>they can find deleted records</strong>.</p>

<p>Consider your entire user is a git repository, and each record type you can
make (post, like, follow, etc) is a directory in your git repo. When you add a
record, it makes a commit to your repo adding that record. Each commit’s
validity, like git, relies on knowing the thing that came before it. This
means that, like a git repo, you need to rewrite the entire commit log from
the deleted commit onwards to actually delete a commit. Bluesky does not
currently expose the ability to rebase your repo:</p>

<p><img src="/assets/img/897533d8791f2679780baf06fdad0164e99bbd53.png" alt="image" /></p>

<p>I’m very glad to hear that they intend to expose this functionality but it’s
definitely a real issue to be really concerned about right now.</p>

<h3 id="soft-blocks-can-never-be-supported">Soft blocks can never be supported</h3>

<p>To follow someone, you create a “follow” record in your repository. The only
person that can revoke that record is whoever holds the private key for your
repo. If another user blocks you and you’re currently following them, the
block event would have to ask you to revoke your own follow.</p>

<p>Since federation is not yet enabled and since Bluesky (at least currently)
has your private key, they <em>could</em> action an unfollow for you when you get
blocked, but this doesn’t reliably hold true in a federated world, nor in a
potential world where clients are the only holders of their private keys,
where a homeserver could purely exist to mirror your data on to the wider
network. Even in the circumstances where this could work, it doesn’t seem
right to sign a piece of data without explicit instruction from the user to
which the private key belongs.</p>

<p>This doesn’t mean that if someone is following you and you block them, they’ll
still see your posts. They won’t. On a well-behaved homeserver it will not
show your posts to blocked users even if they’re following you, and Bluesky
<strong>could</strong> be implemented such that a remote user’s homeserver isn’t told about
your new posts if they don’t have any non-blocked users following you.</p>

<p>I’m unsure how practical this would be, but the protocol <em>could</em> be changed
such that every attempt to follow a user needs to be co-signed by the user
being followed. That user can then revoke their co-signature when they block
the follower, though this would mean that resolving a user’s following list
would involve cross-referencing it with co-signatures to check for revocation.
I have a feeling something like this is going to need to be implemented
anyway if Bluesky plans to have locked accounts some day.</p>

<h3 id="misleading-urls-and-mentions">Misleading URLs and mentions</h3>

<p><img src="/assets/img/261f7a3c564e5c4ef632f8199d75f4b7a0a11d4e.png" alt="image" /></p>

<p>It is currently extremely trivial to create URLs that look like something
they’re not. it’s very, very easy to make a “google.com” post that actually
leads to a RickRoll (or much, much worse) or make a mention that, when
clicked, leads to a very different user than you’d expect. The URL problem
here is much more of a concern. This problem is solvable to a degree, and I’ve
seen the devs musing on how they’d fix it, which is promising.</p>

<h2 id="conclusions">Conclusions</h2>

<p>I am mostly hopeful for the future, but I am also concerned about the
challenges posed by the relatively-new frontier that is moderation on a
federated network. I think these challenges may have good solutions, but will
need time, practice, and experimentation.</p>

<p>I also think the Bluesky devs might have bitten off more than they can chew in
the short term. The devs do seem to accept this. Their team is small, they’re
working very hard, and their intentions seem good; but the last week has seen
a large influx of users, as well as an influx of problems that require both
careful consideration and better tools.</p>

<p>In the longer term, I’m encouraged by a stated goal of
<a href="https://blueskyweb.xyz/blog/4-13-2023-moderation">Composable Moderation</a>, and I’m encouraged by the idea of shared
reputation lists that users can subscribe to and publish, to shape their own
view of the network and help others shape their own views of the network, but
I think the responsibilities of a homeserver admin are still going to include
protecting their users using a combination of traditional methodologies as
well as the brave new world of moderation that can be afforded to us all with
decentralisation and algorithms.</p>]]></content><author><name></name></author><category term="bluesky" /><category term="moderation" /><summary type="html"><![CDATA[The new kid on the block for microblogging is a platform called Bluesky, and I’ve been thinking about how user safety intersects with its unique circumstances.]]></summary></entry><entry><title type="html">Postel’s Law: Protocol Disintegration By Committee</title><link href="/2022/07/31/robustness-principle.html" rel="alternate" type="text/html" title="Postel’s Law: Protocol Disintegration By Committee" /><published>2022-07-31T00:00:00+00:00</published><updated>2022-07-31T00:00:00+00:00</updated><id>/2022/07/31/robustness-principle</id><content type="html" xml:base="/2022/07/31/robustness-principle.html"><![CDATA[<p>There’s a thoroughly written rule within software communities that you may
have come up against: <em>don’t implement the protocol yourself.</em></p>

<p>I was about 15 when I was first faced with this refrain; I was an arrogant
teenager who insisted that even if the wheel had already been invented, I
wanted to take my swing at it; maybe my wheel would be wheelier than theirs,
maybe I’d learn something about wheels, maybe I’d have fun. I wanted to
viscerally understand the machinations of the code that sits behind the
curtain of human-friendly interfaces, as if doing so would make me a <em>real</em>
programmer.</p>

<p>I’ve grown a love-hate relationship for that partially-enduring impulse; I get
a deep satisfaction from cresting the mountain of a learning curve, but I also
manage to scope-creep any project I get my paws on, and what I’ve learned
along the way is that the majority of psychic damage inflicted by
reimplementing widely-implemented protocols is just how bad other people’s
implementations can be.</p>

<h2 id="youd-think-they-could-at-least-get-that-right"><em>you’d think they could at least get that right??</em></h2>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/* Stupid broken piece of shit ircd didn't send us 001,
   you'd think they could at least get that right??
   But no, then I'll have to go and add these idiotic kludges
   to make them work. Maybe I should instead get the users of these
   servers to complain about it to their admins.
   
   [...] */
</code></pre></div></div>

<p><a href="https://github.com/irssi/irssi/blob/de46fee864818c8174aa63342378f18fb686ea72/src/irc/core/irc-servers.c#L1051-L1058">This</a> understandably disgruntled comment clearly expresses the dilemma
here: you either begrudgingly handle other software’s incorrect data, or you
hope that ecosystemic pressure may force their hand to stop doing it. I’m here
to tell you this developer made the wrong choice, and how this choice
consistently facilitates protocol degradation that makes implementing
protocols an insurmountable task.</p>

<h2 id="unicode-dammit"><em>Unicode, Dammit</em></h2>

<p>A common casualty of permissive input handling is <a href="https://bazaar.launchpad.net/~leonardr/beautifulsoup/bs4/view/642/bs4/dammit.py">anything</a> that handles
web pages.</p>

<p>Any of you that have had the <em>joy</em> of being in the weeds of web development
will be all-too-familiar with how frequently <em>it works on my machine</em> isn’t a
sufficient answer; there’s a <a href="https://www.browserstack.com/">whole industry</a> built around one of the
pains that the robustness principle promulgates; browsers have all had to make
their own secret sauce for handling the many innovative ways people have found
to write web pages incorrectly, and you cannot trust that your code is correct
just because your browser makes it look ok.</p>

<p>People are, by and large, free to write absolutely god-foresaken HTML that,
when you <a href="https://bazaar.launchpad.net/~leonardr/beautifulsoup/bs4/view/642/bs4/builder/_htmlparser.py#L83">squint</a>, looks roughly logical, so browsers help you out and
take a guess at what you actually meant, rather than telling you that you’ve
written something invalid and really ought to go figure out how. The fact that
people don’t even know they’ve done something incorrect hurts the ecosystem,
skips over an opportunity for that person to learn, and makes the task of
implementing generalised web page parsing out of the reach of most people.</p>

<p>HTML5 has <a href="https://html.spec.whatwg.org/multipage/parsing.html#parse-errors">spec-defined</a> the <em>correct</em> way to handle invalid HTML
documents which may help this; it’s still going to allow incorrect code to
proliferate unimpeded, but at least it will be somewhat predictable. There’s a
lot of reasons that the browser market <a href="https://en.wikipedia.org/wiki/Comparison_of_browser_engines">isn’t a crowded field</a>, but I’m
willing to bet the bar to entry of handling global decades worth of
noncompliant data doesn’t help.</p>

<h2 id="i-have-allowed-it-anyway"><em>I have allowed it anyway.</em></h2>

<p>While doing a bit of research for this blogpost, I happened upon a
<a href="https://github.com/yaml/pyyaml/blob/0abad85a17ba75c0fb431feea7a6a06125341a99/lib/yaml/scanner.py#L1350-L1351">comment</a> in pyyaml’s code that sent me down a bit of a rabbit hole;</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># For some strange reasons, the specification does not allow '_' in
# tag handles. I have allowed it anyway.
</code></pre></div></div>

<p>‘Tags’ are a way to decorate a value with a hint to tell the parser how to
parse it. think of an example like <code class="language-plaintext highlighter-rouge">date: !iso8601 2022-01-01</code>; <code class="language-plaintext highlighter-rouge">!iso8601</code> is
the tag, <code class="language-plaintext highlighter-rouge">iso8601</code> is the tag handle.</p>

<p>As promised, <a href="https://yaml.org/spec/1.0/#ns-tag-char">the specification</a> does not allow <code class="language-plaintext highlighter-rouge">_</code> in tag handles, but
the <a href="https://github.com/yaml/libyaml/blob/e71095e3bf9b5f2222cde446327506542f86c847/src/scanner.c#L2951">earliest commit</a> of tag handles in libyaml does; this commit does come
after the publication of yaml 1.1, but that <a href="https://yaml.org/spec/1.1/#ns-word-char">also</a> does not allow <code class="language-plaintext highlighter-rouge">_</code>, and
neither does the <a href="https://yaml.org/spec/1.2.2/#rule-ns-word-char">most recent version</a> of the yaml specification. A
popular <a href="https://github.com/chyh1990/yaml-rust/blob/da52a68615f2ecdd6b7e4567019f280c433c1521/src/scanner.rs#L793">rust library</a> accepts <code class="language-plaintext highlighter-rouge">_</code>, as does a popular <a href="https://bitbucket.org/snakeyaml/snakeyaml/src/607672097f3aeec3357488881440c730900b06b6/src/main/java/org/yaml/snakeyaml/scanner/ScannerImpl.java#lines-2228">java library</a>,
as does a popular <a href="https://github.com/aaubry/YamlDotNet/blob/fd6731d4ab6bb4f3bec79a47b9ecb60f0d8e415f/YamlDotNet/Core/Scanner.cs#L2550">.net</a> library, et cetera.</p>

<p>Although the case of tag handles are a bit of a niche (just happened to have
the best comment), what this demonstrates is that for anyone optimistic enough
to try their hand at implementing this protocol, reading and implementing the
specification alone will not suffice for functionality parity with even the
reference implementations of it. They will come to learn that, no matter what
the specification says, someone will end up approaching your software with
data they expect to work, because the reference implementation and most
implementations derived from it will accept it.</p>

<h2 id="why-does-this-matter">Why does this matter?</h2>

<p>Something that motivated me to write this blogpost is my sorrow at communities
moving from IRC to proprietary communication platforms simply because they’re
nicer to use, and the upsetting realisation that a massive barrier to entry
for writing new and better IRC software is how absolutely maddening it is to
try to write IRC software capable of accepting 3 decades worth of
<a href="https://modern.ircdocs.horse/">infamously</a> subtly invalid protocol being spoken by other software.</p>

<p>As the complexities of writing software grow, the accessibility for hobbyists
and enthusiasts wanes. We’re watching the industry creep further and further
towards meaningful projects needing to be backed by well-resourced outfits to
be able to find their feet and that’s intensely damaging for personal
freedoms, as well turning away would-be revolutionaries from even trying to
make their mark. Something that is definitely within our collective control is
ensuring our own software contributes to enforcing spec-compliance, so that
new software starts off having to compare itself to a well-functioning
ecosystem.</p>

<p>I do recognise that reversing the dogma of permissive input handling is going
to be impractical for a lot of already-broken protocols without very slow
incremental moves like HTML5 has tried, but it feels like we as free software
advocates should have a moral compulsion to keep protocols reasonable to
implement to avoid concentrating expertise in to precariously few hands, and
The Robustness Principle, practically, runs counter to this goal.</p>]]></content><author><name></name></author><category term="protocol" /><summary type="html"><![CDATA[There’s a thoroughly written rule within software communities that you may have come up against: don’t implement the protocol yourself.]]></summary></entry></feed>