Discussion about recent CoC events

I wasn’t involved in this, but followed every link Thomas shared concerning Stefan Krah’s ejection, and didn’t see anything plausibly connected to “those who are not in a majority demographic”. But if some of the other people in those threads were, I wouldn’t know it. I didn’t see Stefan attacking anyone based on their race, gender, sexual orientation, ancestry, religion, age, able-bodiedness, …

If anything, Stefan is such an outlier in respect of being a loner, and in being so fiercely protective of “his turf”, that he’s plausibly in a minority neurodiverse demographic of some kind. I had no problems working with him, which meant, in practice, recognizing that effective communication with him had to be tailored to avoid his triggers. Fine by me. His work was truly world-class, and his devotion to it nothing short of fanatic.

That said, I don’t question that the SC acted in good faith here. Just noting that the explanation given did little to persuade me it was a wise decision. The threads I saw linked to were unpleasant but not especially abusive to my ears. But I view the Python community as more of a family, so may have unusually high tolerance for accepting the bad parts along with the good. I’m also too old to imagine that an egalitarian utopia can be established by ostracization.

In any case, this isn’t intended to pick on you, or to put you on the spot. I’m just writing here because it built on a tiny part of what you wrote. You do have my vote, and my appreciation & thanks for your service :slightly_smiling_face:


Hi Tim,

Thanks for the comments. I think it’s good to discuss these issues.

First, I want everyone to know that my comments (For those that disagree with our actions, I encourage you to spend time walking in the shoes of those who are not in a majority demographic. As a community, we have made strides forward, but there is still work to be done to be inclusive.) were not reflective of any particular Code of Conduct issue. I’m also sorry that I didn’t phrase it as “I encourage you to spend time walking in the shoes of others”. It’s what I try to do as an individual in day to day interactions as well as when reviewing conduct reports.

Second, let me share my personal view of Codes of Conduct in other communities like Jupyter. When a CoC is well written, monitored, and thoughtfully acted upon, a Code of Conduct sends a message to the community (or potential community) members that the project strives for a professional working environment. The CoC signals that the community works on solving technical issues without resorting to direct personal attacks or disparagement.

What I have seen in several communities outside of Python is that there are at least two sides to every story. Often, a report out to community members only provides a slice of a bigger picture. Due to privacy of the individuals involved in a report, all information is not fully public. My experience in these other communities that people often give the person named in a report the benefit of the doubt and do try to provide many attempts to educate and thoughtfully redirect individuals prior to any individual losing privileges, temporary or permanent.

That said, I don’t question that the SC acted in good faith here. Just noting that the explanation given did little to persuade me it was a wise decision. The threads I saw linked to were unpleasant but not especially abusive to my ears.

I understand and respect your perspective here in light of the information that was publicly posted.

But I view the Python community as more of a family, so may have unusually high tolerance for accepting the bad parts along with the good. I’m also too old to imagine that an egalitarian utopia can be established by ostracization.

I think that it’s great to view the Python community so warmly. People are human and a high tolerance for bad and good in an individual interaction is a very reasonable approach. When looking at this where a person displays a pattern of unprofessional interactions that not only repeat but escalate, this person’s interactions likely chip away at the community’s effectiveness and ability to be productive. I hope you’re not too old since I’m a similar vintage :wink:

I really appreciate your willingness to share your thoughts. Maybe someday there will be a Zen of Python community.



+1 He was uniquely talented and devoted.

I worked with him on the decimal module and found him to be prickly to work with but well within normal tolerance. He was not my friend, but I admired his first-rate, deeply technical work on a module that is of great importance to some segments of our community. I don’t think he will ever be replaced and that users will be permanently worse off for his departure.


First, I’d like to thank Tim for opening up this important discussion. Even though I have not interacted much with Stefan, I share Tim’s views on the case and the topic in general.

What I find a bit sad, is that your nomination thread gets hijacked in this way. Perhaps the @moderators could branch this off into a separate thread.

This is a very important point which people who are creating CoCs or dealing with cases tend to forget. In reality, a CoC is not just a text put up somewhere for people to read, but it becomes a “legal code” of some sense. Albeit, without the long history of legal systems, their working standards and distilled experience.

The major issue I see in a lot of these CoC systems, is the imbalance you often find in the texts or the rules communities set out for people working with the CoCs. Any modern legal system will use the standard “not guilty until proven otherwise” and provide the individual being addressed with a fair trial. CoCs often miss these standards and instead are one sided, putting too much power on the side of the reporter(s) and the CoC committee, without giving the individual a chance to share his/her views or appeal against the CoC committee decision.

Since a lot is at stake in more serious CoC cases, adopting a process similar to a standard trial system or at least following those standards is warranted, IMO. It doesn’t have to be as formal, but all participants should understand the process, their rights and means of appeal.

That said, and going back to the family analogy Tim mentioned, which I very much like, I think CoC teams should really only use their powers as last resort, even more so, since they are typically not trained in the field. It is much more productive and fulfilling to try to offer early help by moderating, mentoring people out of the crisis and creating a good level of understanding, than to use ultima ratio. It often is difficult and draining, but when it works out, it’s a very rewarding and positive experience.

Even in the case of taking action, it is better to do this knowing that the indvidiual understands the reasoning, gets a chance to improve and be pardonned at a later point in time.

I can’t comment on whether this was tried or not in the case of Stefan, since I don’t know the details, but his reaction shows that he did not understand why ultima ratio was chosen, so in the end everyone lost.

Another aspect to discuss is why people who are elected to stear the development and design of Python should also have to take on the responsibility of handling developer management.

IMO, it would be better to separate this out into a team, which comes with more emphasis on HR and social skills. This team could then also be called to step in early when things are moving into the direction of a CoC case.


Nobody is questioning his talent. But talent and technical expertise are no excuse for abusive behavior.
I was attacked by Stefan on multiple occasions. His actions made me to consider retiring from core development.

Let’s not forget that it was Stefan’s own decision to refuse mediation and to permanently leave core dev. The SC gave him a chance to apologize and change his behavior. He is the offender, not the victim.


Sure, since you were a participant, by your telling of the tale everything is the other party’s fault, and none is anyone else’s. By Stefan’s telling of tale (which I haven’t heard), I’d expect to hear the reverse. This relates to Marc-Andre’s valid point that disputes among humans are as old as humanity, but a committee deliberating in secret is a very far cry from the transparency most societies strive for in their legal systems (at least in advertised theory if not in practice). Centuries of effort went into crafting those.

“He is the offender, not the victim” is an absolute black-and-white bit of advocacy for “your side”. That’s fine so far as it goes, but it’s only one side. It’s quite possible to be both an offender and a victim. They’re not mutually exclusive, and even long-established legal systems can themselves be sources of injustice to no-doubt-about-it offenders.

But not the only reason you considered retiring. By your older account here, it’s apparently not even the primary reason (I assume the “unrelated incident” here refers to some flames from Stefan on BPO; Stefan didn’t participate in the python-dev threads you were primarily objecting to):

At one point I have even considered to retire from Python core development completely. I’m profoundly disgusted and appalled by the racist attitudes and self-importance of some people as well as an unrelated incident on BPO last week.

Which is an illustration of that advocacy causes stories to morph. One reason for why actual legal systems hear both sides, and allow each to challenge the other directly.

In the absence of that, for those of us not directly involved, and not privy to the SC’s deliberations, an attempt to “assign blame” is basically just a popularity contest - and, at this point, with only one side allowed to continue campaigning for support.

I don’t have an opinion on “who’s to blame” to advocate for. I’ve only noted that the explanations I’ve heard don’t make a compelling case. Which comes with the “secret deliberation” territory.


Please read this message (I was not involved in the ticket, Stefan added me to the nosy list in the same transaction).

and this entire ticket:

If you compare dates, you will realize that my “unsubscribing” message was sent days following the tickets. I did not mention my dispute with Stefan in the public mail, because I reported the incident to the CoC WG and did not want to drag the threads into python-dev.

Christian, right, Thomas had already shared links to both of those, and I already read all of them.

I don’t approve of what Stefan did in those. But I don’t approve either of far more overtly threatening things people have directed at me, or Guido, or … over the Python decades. They’re still “family” to me, and things usually blow over in time. There are still some people I will never interact with, though. They hate my guts, and I hate theirs :wink:. So it goes.

What’s missing from the SC account is establishing a verifiable long-term history of interventions that failed. I don’t doubt such exists, but I take that on faith in the good characters of the SC members - and never heard Stefan’s side of it, beyond his resignation announcement, which didn’t mention any specifics.

The points I’ve been trying to make aren’t really about Stefan, or you, anyway. They’re about perceived flaws in the expulsion process.

1 Like

We can split this off if Carol would like it to be (and other people can weight in by flagging issues to commenting you think it should be split off).

1 Like

Note that it’s already been split off. Nothing more to do here :smiley:.

1 Like

Tim, I was not a participant in the event, but after I came across the posts I felt just as others have (and probably more that didn’t say anything felt too). I lost all motivation to interact with that part of CPython again, until I saw that the CoC took the incident seriously. The other incident that was widely discussed on the mailing list has left a bad taste in general for me to interact through those venues.

I don’t approve either of far more overtly threatening things people have directed at me. … They hate my guts, and I hate theirs. So it goes.

I guess it’s up to you to accept that for yourself, but that’s not at all a healthy way to foster a community, and should not be a required mindset for others to feel welcome to participate. If people are making threats to you or someone else, that should be addressed. If I had to worry about someone who was consistently abrasive to me or others every time I made a contribution, I would not make a contribution.

The argument that the CoC should be more like a government’s legal system can have merit, to draw ideas for how to improve (or what to avoid). But the CoC does not have the same scope, resources, or consequences as a legal system, and has other needs geared towards a smaller community. I think at this point you need to lay out exact changes that you have in mind, otherwise the things you’re saying are coming off as dismissive to me at least and are hard to respond to without being vague and going in circles.


David, you make some good points, but I’m bowing out of this now. I don’t believe there are easy answers, and if I had major time to fully address it, I’d run for the SC myself. As is, Raymond Hettinger’s vaguely expressed concerns seem closest to matching mine, so I’ll vote for him too.

I haven’t been advocating for anything specific here. I have been advocating for people questioning the process. Those also serve who only toss tomatoes :wink:.


OK, thanks. It sounds like the CoC group has taken things seriously so far, and are also committed to improving their process and documentation as they learn more based on feedback like this.


I find myself agreeing strongly with this sentiment, although with the caveat that we should resort to removing people from the community entirely as a last resort (and suspension as a second-to-last resort). From my perspective, the Stefan case might not have gone this way had it been kept internal while Stefan deliberated w/ the SC instead of him publicly resigning. In an optimal scenario, he would have received help in improving his communications with others and then re-integrated back into the community, but it doesn’t always work out that way sadly.

Having to constantly feel like one is under threat of personal attacks and deal with non-constructive negativity repeatedly leads to more frequent burnout, which is enough of an issue in open-source development as it is. It also results in turning away newcomers to that area, increasing our “bus factor” substantially. That’s why I think that repeated cases of abrasive behavior shouldn’t be swept under the rug simply because that individual has made impactful contributions.

So rather than prioritizing tolerating the behaviors of (an) individual(s) that make everyone else’s experience worse off, it’s much more important to prioritize fostering a positive environment that people find rewarding to engage in. This makes contributing in general more enjoyable and greatly improves the long-term sustainability of CPython, IMO.


Let me comment this topic as a member of the current Steering Council, but also as an individual.

What we tried to do in the SC is to forbid some specific behavior that we no longer tolerate (but have been tolerated for years), rather than targeting specific persons.

Having to handle CoC violations as part of the SC was really stressful and painful for me. We spent multiple meetings about these issues and it was painful for everybody. I was really not comfortable with the two bans that we applied, but I’m proud that we did it and I don’t regret. Having to justify our actions is not easy for me neither.

Sadly many evidences are private to protect victims, but also the abuser. Please remind that the first core developer who has been banned was not named for a good reason, to give them a chance to change their behavior. We did our best to handle these CoC incidents privately, sadly for one case it had to be made public.

In another topic, Raymond wrote:

Honestly, a few years ago, I had the same feeling: Python is a very welcoming community and there is no conduct incident at all!

Then I met some (non core dev) developers in person who reported to me privately various kind of abusive behaviors in the Python community. I started to pay more attention to that on python-dev and bugs.python.org, and I started to see more and more patterns. Months after months, I got more and more reports in private.

Why not talking about these issues in private? Well. When the abuser is more famous than the victim, other people will first believe the abuser if the victim decides to start talking. It’s not only about the popularity, but also about technical skills, gender, origin, etc. More generally, the victim always feel ashamed of being a victim and prefers to attempt to forget what happened, rather than making it more known.

Multiple core developers suffered from various kinds of abuse, but this is little known. Since people talked to me in private, I cannot share what they told me without breaking their trust. I can only suggest you to ask around you if someone got bullied or harassed once.

I now always suggest to report CoC violations to the PSF conduct working group. I don’t want to be the judge since I’m far from being objective!

In my experience, it’s difficult to discuss how to deal with CoC violations with someone who has never been a victim. For example, people who have never been a victim usually see a CoC as a threat; they don’t understand that the purpose is to protect, rather the opposite.

By the way, I have been harassed multiple times as a core developer, and I don’t want to talk about that in public neither. All I can say is that I had a burnout and stopped from contributing to Python for 3 months, partially caused by this. I was really close from stopping completely to contribute to the Python project (I only decided to continue because I got a great opportunity at Red Hat).

The SC followed recommendations of the PSF Conduct Working Group.

The SC was not in charge of deciding if messages violated the PSF CoC.


I agree, the quoted statement by @rhettinger is just plain misleading. I didn’t even want to comment on this topic before I saw this quote.

I myself been a witness and even a target of a few abuse incidents (many of which I reported and still have evidence of) way before the SC became a thing. Some of which were way harsher than the links that @tiran shared. That said, this is a tricky topic to discuss openly because many here don’t want to publicly share the especially damning evidence as it will irreversibly harm the abusers. This is something that I, for example, don’t want to be responsible for, so I trust the SC to act on it.

The fact that those issues were essentially ignored in the past and that the abusers just continued the abuse is reprehensible. As is the fact that many core developers I know prefer to not open PRs against certain std lib modules because nothing but headache and shame would result out of that. I’m very happy that we started to pay attention to these issues. Those who cannot fathom that they behave wrong and that they hurt other people (sometimes continuously) for no reason whatsoever should not be missed.


I expect there’s not a person on the planet who hasn’t been the target of abuse, although openness to talk about it varies across subcultures and times. For example, #MeToo was no surprise to women - or to men who knew women.

It’s good to get those out in the open. But some abuses are more damnable than others. Alas, some level of it appears part of the human condition.

As one of the oldest people here, I cut my teeth on Usenet, including from before comp.lang.python’s first day. It was anything-goes. Not only was there nobody “official” to complain to, there was no enforcement mechanism possible. That’s where eternal “flame wars” started, the source of Godwin’s Law, and so on. python-dev rarely still resembles that, and usually only for relatively brief periods.

I doubt anyone with that background would even consider filing a CoC complaint - it’s just not in our view of possibilities. I personally grew a much thicker skin, and became a master at crafting killfiles (filters that removed selected posters and topics from view, based on writing regexps).

And, yup, I’ve seen relatively little in the Python world that matched the level of verbal abuse that was routine in “the good old days”. If I asked people for instances of abuse, I expect I’d have no time for anything else but reading them, so I don’t ask :wink:. Everyone has some story, if they care to share it.

A CoC standing against “serious” abuse is 100% fine with me. Less than that and it gets ever dicier. In my own life, from time to time people I’m engaging with threaten to file a CoC complaint against me. I send them back a link to the reporting email address (which seems surprisingly hard to find! best I know, the mailing address is only buried near - but not at - the bottom of https://www.python.org/psf/conduct/ ).

I suppose they think “what an ass! he thinks he’s so special he can’t be touched!”. But I’m actually thinking “what an ass! I’m calling your bluff - my dispute with you is purely over the technical merits, and/or your repeated failure to show any sign of digesting the background info I organized for you.” Threats of “calling the cops” are also a form of abuse. But too minor to fret over.

You’re in good company: the abuse heaped on Guido over the assignment-expression PEP caused him to finally give up his BDFL position. The abuse heaped on me regarding the same PEP kept me mostly off python-dev ever since too (although I remain its primary moderator, where I view my actual job as preventing spam from getting posted).

It’s OK if you name the modules, and also OK if Raymond is their primary maintainer :wink: But, seriously, without naming them it’s impossible to guess whether “abuse” is at work. I mentioned Raymond because he is the primary maintainer of several std modules for which people make an endless number of suggestions for change. He’s most likely to reject suggestions, which might come across as some kind of abuse, but to his eyes is always for good reasons. It took me months to convince him to add a piddly optional initial= argument to itertools.accumulate(), which is one of the few times I actually disagreed with him about the merits.


I’ve no problem with disputes over technical merits that avoid name-calling and other abusive language. I also trust that SC has no problem rejecting superficial CoC complaints.

To clarify, when I was talking about the abuse I witnessed I specifically meant incidents that involved a fair share of abusive language, often peppered with gaslighting.

Funny enough my own eyebrow-raising experience was about contributing to the decimal module.

The problem often isn’t about the challenge of pushing an API change. The problem often revolves around having excessive friction with mundane code maintenance.

In other words, a module author should not retain veto over everything affecting their code forever. And that’s something we still struggle with at times in CPython.


Sure, that’s totally one way to run a community. But it’s not the only option, or necessarily the best. I also grew up in the “anything goes” days of open-source mailing list interaction, and I can navigate it just fine when I have to. But I increasingly find myself unwilling to try, when there are so many other projects where the community is more welcoming, supportive, and pleasant to work with.

We can decide what kind of community we want CPython to be. We can decide that thick skins and killfiles are key skills for contributors, and lose the contributors who don’t want to deal with that. Or we can decide to make this a more civil, welcoming place, and lose the contributors who don’t want to deal with those restrictions. I think a lot of us would prefer the former, and that requires a functioning CoC and active enforcement of some kind.


Nathaniel, sure. I wasn’t advocating for going back to the wild west. Just explaining for the youngsters why the oldsters may be less exercised over transgressions that wouldn’t even have merited a comment in the bad old days.

There is a range of possibilities here. I don’t want to live at either of the extremes.