# Updating the Go Code of Conduct
23 May 2018
Tags: conduct
Summary: In November 2015, we introduced the Go Code of Conduct. It was developed in a collaboration between the Go team members at Google and the Go community. I was fortunate to be one of the community members invited to participate in both drafting and then enforcing the Go Code of Conduct. Since then, we have learned two lessons about limitations in our code of conduct that restricted us from being able to cultivate the safe culture essential to Go’s success.

Steve Francia

##

In November 2015, we introduced the Go Code of Conduct.
It was developed in a collaboration between
the Go team members at Google and the Go community.
I was fortunate to be one of the community members
invited to participate in both drafting and then enforcing
the Go Code of Conduct.
Since then, we have learned two lessons about
limitations in our code of conduct that restricted us from
being able to cultivate the safe culture
essential to Go’s success.

The first lesson we learned is that toxic behaviors by
project participants in non-project spaces can have a
negative impact on the project affecting the security and safety of
community members. There were a few reported
incidents where actions took place outside of project spaces
but the impact was felt inside our community. The specific
language in our code of conduct restricted our ability to
respond only to actions happening “in the official
forums operated by the Go project”. We needed a way
to protect our community members wherever they are.

The second lesson we learned is that the demands required
to enforce the code
of conduct place too heavy of a burden on volunteers.
The initial version of the code of conduct presented the
working group as disciplinarians. It was soon clear
that this was too much, so in early 2017 [we changed the group’s role](https://golang.org/cl/37014)
to that of advisors and mediators.
Still, working group community members
reported feeling overwhelmed, untrained, and vulnerable.
This well-intentioned shift left us without an enforcement mechanism
without solving the issue with overburdened volunteers.

In mid-2017, I represented the Go project in a meeting with
Google’s Open Source Programs Office and Open Source Strategy Team
to address the shortcomings in our respective
codes of conduct, particularly in their enforcement.
It quickly became clear that our problems had a lot in common,
and that working together on a single code of conduct for all
of Google’s open source projects made sense.
We started with the text from the
Contributor Covenant Code of Conduct v1.4
and then made changes, influenced by
our experiences in Go community and our collective experiences in open source.
This resulted in the Google [code of conduct template](https://opensource.google.com/docs/releasing/template/CODE_OF_CONDUCT/).

Today the Go project is adopting this new code of conduct,
and we’ve updated [golang.org/conduct](https://golang.org/conduct).
This revised code of conduct retains much of the intent, structure and
language of the original Go code of conduct while making two critical
changes that address the shortcomings identified above.

First, [the new code of conduct makes clear](https://golang.org/conduct/#scope) that people who
participate in any kind of harassment or inappropriate behavior,
even outside our project spaces, are not welcome in our project spaces.
This means that the Code of Conduct applies outside
the project spaces when there is a reasonable belief that
an individual’s behavior may have a negative
impact on the project or its community.

Second, in the place of the working group,
[the new code of conduct introduces a single Project Steward](https://golang.org/conduct/#reporting)
who will have explicit training and support for this role.
The Project Steward will receive reported violations
and then work with a committee,
consisting of representatives from the Open Source Programs Office
and the Google Open Source Strategy team,
to find a resolution.

Our first Project Steward will be [Cassandra Salisbury](https://twitter.com/cassandraoid).
She is well known to the Go community as a member of Go Bridge,
an organizer of many Go meetups and conferences,
and as a lead of the Go community outreach working group.
Cassandra now works on the Go team at Google
with a focus on advocating for and supporting the Go community.

We are grateful to everyone who served on the original Code of
Conduct Working Group. Your efforts were essential in creating an
inclusive and safe community.

We believe the code of conduct has contributed to the
Go project becoming more welcoming now than it was in 2015,
and we should all be proud of that.

We hope that the new code of conduct will help protect our community
members even more effectively.
