Hello Twisted community!
Recently we've had some emotional language around the release process. On
https://github.com/twisted/twisted/pull/1464
<https://github.com/twisted/twisted/pull/1464>, Craig said several times that
he found Adi's work and process changes "very aggressive". Obviously, to have
suggested this, Craig would have found some things Adi said to be emotionally
loaded as well.
I think we need to resolve this conflict in order to move forward productively
and avoid wasting more volunteer energy on negative feelings. In order to do
that, I think we need to centralize the discussion here.
At this point I think we need to all begin with a presumption of good faith.
Adi, Thomas Grainger, Tom Most, Maarten, Povilas and Craig are all trying to
address big problems in Twisted. Nobody's trying to be aggressive, even if
it's coming across that way.
(Personally, I should acknowledge that I don't see Adi's actions as aggressive,
but I think we have to address Craig's perception that they are. Part of the
presumption of good faith is presuming that everyone has valid reasons for
their reactions.)
Here's the status as I understand it:
Adi, Thomas, and Maarten are trying to address release automation issues to
make future releases go faster. They've merged several changes, including
https://github.com/twisted/twisted/pull/1464
<https://github.com/twisted/twisted/pull/1464>, to that end.
Craig is trying to get out a release according to the current process, which
means addressing https://twistedmatrix.com/trac/ticket/10069
<https://twistedmatrix.com/trac/ticket/10069> as it is a release blocker. He
has a fix for this, but that fix is blocked.
While we've been waiting on #2, the changes in #1 proceed apace. Craig's also
noted several times that I've given permission for him to do the release and so
he feels that breaking things mid-way is reneging on a promise from the project.
I believe the proximate cause of the conflict here is that we're dealing with
this regression incorrectly. When a regression is introduced, there's a
process for dealing with it, originally documented here:
https://twistedmatrix.com/trac/wiki/ReviewProcess#Revertingachange
<https://twistedmatrix.com/trac/wiki/ReviewProcess#Revertingachange>. [1] The
principle we need to outline clearly is this: if we have a regression, the
change that introduced it should be reverted as soon as possible. If we can't
revert it directly because of changes to trunk in the meanwhile that introduce
conflicts, ideally the change that we would make would be the closest possible
thing to reverting it, even if that reintroduces a known bug that we have to
reopen.
In the case where a lot of work has happened in the interim, and it's less work
to just "fix forward" on top of trunk, it's fine to do a small fix as an end
run around this process. The goal of this process is to minimize the work
required to restore trunk to a releasable state.
Right now we have three competing fixes which have all been flagged as
incorrect in various ways:
from Tom: https://github.com/twisted/twisted/pull/1499
<https://github.com/twisted/twisted/pull/1499>
Craig rejected this one by saying it will break "certain versions" of Python,
but I don't understand why it was closed rather than reviewed / reassigned as
normal. (Or for that matter which versions are the problems, or how it breaks
them.)
from Adi: https://github.com/twisted/twisted/pull/1501
<https://github.com/twisted/twisted/pull/1501>
Craig rejected this one by saying "please stop working on this" but it also
doesn't have any technical reason that this solution is incorrect.
from Craig: https://github.com/twisted/twisted/pull/1502
<https://github.com/twisted/twisted/pull/1502>
This was originally given a passing review by Povilas from the Buildbot
project, but twm added an additional blocking review shortly thereafter
explaining that it introduced an additional regression. It seems as though
this one is now actively being worked on?
Craig: you closed two of these issues on the basis that you were "already
working on a fix", but that's not a valid reason to close a PR. Or, for that
matter, to give it a failing review. In the future, please comment on PRs that
you don't want merged by pointing out their technical insufficiency, so that we
can take the opportunity to learn for the benefit of future maintenance. In
this case, the underlying issue is clearly quite nuanced and requires expertise
that touches platform differences in Python's core APIs, so having multiple
people working on different fixes is totally fine; this effort is not wasted if
everybody learns a little bit about the code in question, and it's definitely
not wasted if we have to synthesize our approaches in the end anyway because
they address different cases.
If you are pressed for time and don't have the ability to enumerate a large
number of subtle problems, it's fine to post a changes-required review saying
something high-level, such as "this does not address a number of issues that
I've taken into account in my fix in #NNNN; please see the code on that PR for
more detail, I can answer specific questions later".
All of these fixes have each been outstanding for weeks, which strongly
suggests that this is way too hard to fix forward and we should have stopped
trying a while ago. We should fall back to the previous one if in any way
possible, then reintroduce the changes which caused it. If we're really just
about to land 1502, then feel free to complete the work there, but in the
future we should regard this kind of delay in reverting as a process failure.
If there are too many conflicts to address in a revert, and reverting means we
need to revert 3 or 4 tickets which have built on top of that work, then let's
just do that and get those re-merged later as well. It's unfortunate to ship
without features but it's better than multi-month release hold-ups.
(Note: a straight revert doesn't require a full code review. If you can revert
a merge and CI is happy with it, feel free to get an administrator to smash the
red button to merge immediately.)
I think a secondary problem is that we have not traditionally been very clear
about the role of "release manager". My intent for the role was originally
that it last 1-2 weeks at most, and the responsibility is supposed to begin
just a bit before the first prerelease is uploaded, and end when the final
release is completed and the release announcement is written.
Given that it's the release manager's responsibility to ensure no regressions
are present in the release, this can come along with a little bit of soft power
where we should all promptly honor the current RM's request to revert things or
to prioritize review of fixes for release blockers which might not be
straightforward code regressions and therefore can't be fixed by a revert (for
example, 3rd party services like readthedocs or github actions breaking our
integrations or CI due to no change of our own). However the RM has no special
authority to circumvent processes, land code, prevent or code from landing, and
should ideally never be making changes to the process in-line with the manual
process of making the release.
The release manager really isn't supposed to do a bunch of development on
trunk. This has been confounded in the past by the fact that in the past Amber
has been both a prolific contributor and the release manager, often at the same
time; and, as a way to make the manual process easier, she often would do a
bunch of automation work right before a relase. But the role, inasmuch as it
exists, ought to be about executing whatever manual steps remain after we've
automated as much as we can. Similarly, Amber's faithful execution of this
role for years was a great benefit to everyone working on the project, but it
also obscured that the RM is supposed to be a hat that one person wears for one
to two weeks. My personal feeling (it certainly would overstate this to call
it a "process") is that if someone takes on the release manager role and can't
get a prerelease out within a week, then they should step down and we should
have a bigger community discussion about why we're stuck.
My follow-up questions are:
Can we revert the change that introduced 10069 so that we can follow the
process to re-introduce it after a release has been made, and have the
conversation about which PR to accept and why post-release?
Do we need to revert the release process changes from
https://github.com/twisted/twisted/pull/1464
<https://github.com/twisted/twisted/pull/1464> for this release? If so, what
is the specific technical need this addresses?
Is there some problem with the release process changes that ought to make this
revert more permanent? They look really good to me, but I don't want to
discount that possibility either. A reviewer can always request that code be
pulled back out of trunk if there's a problem that was not forseen during the
review process?
-g
[1]: I'm not sure if this has been propagated forward to our newer process docs
in git; it would be good to delete most of this doc and replace it with a bunch
of links so we don't have duplicate and outdated docs.
_______________________________________________
Twisted-Python mailing list
Twisted-Python@twistedmatrix.com
https://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python