|
| 1 | +# Project Group RFC |
| 2 | + |
| 3 | +# Summary |
| 4 | + |
| 5 | +- Formalize project groups as groups dedicated to completing specific projects |
| 6 | + within the context of a Rust team |
| 7 | +- Project groups are created via an RFC and have a "parent team" (or |
| 8 | + multiple teams) |
| 9 | +- The groups then drive the project to completion, e.g. by authoring follow-up |
| 10 | + RFCs and doing design work. |
| 11 | +- Each project group typically has: |
| 12 | + - A charter outlining the group's scope and goals. |
| 13 | + - Appointed shepherds and team liasons. |
| 14 | + - An associated repository. |
| 15 | + - Regular meetings. |
| 16 | + - Dedicated streams on Discord/Zulip/etc. |
| 17 | +- Define working groups to refer to the "domain working groups" that are created |
| 18 | + to explore particular domains, such as embedded, CLI, etc. |
| 19 | + - They have a charter and defined leads but operate more independently from |
| 20 | + the Rust teams. |
| 21 | +- Define community group as the term for groups not formally affiliated with the |
| 22 | + Rust project. |
| 23 | + |
| 24 | +# Motivation |
| 25 | + |
| 26 | +Working groups were not created through the RFC process, as such there's not |
| 27 | +much documentation on exactly what a working group does, what are its |
| 28 | +responsibilities, and also importantly setting expectations or goals. There is |
| 29 | +one definition of "Working Group" available in [rust-lang#54445]; quoted below. |
| 30 | + |
| 31 | +> A Rust Working Group is a set of people working at common purpose. Working |
| 32 | +> Groups are associated with a Rust team. Unlike a Rust Team, Working Groups |
| 33 | +> don't have "formal decision making power", though often they are charged with |
| 34 | +> drawing up recommendations, RFCs, or other documents for the teams (which is |
| 35 | +> then intended to make the final decision). |
| 36 | +
|
| 37 | +While this definition is true in the broad sense, it does not define the |
| 38 | +difference between what has come to be called "Domain Working Groups" and |
| 39 | +"Team Working Groups". Additionally the community has also adopted the Working |
| 40 | +Group terminology for organising and working on areas they are interested in, |
| 41 | +independent of The Rust Programming Language's Working Groups. It's great that |
| 42 | +we have a community able to self organise in this way, however it has led to |
| 43 | +some confusion over who is supporting these efforts, and whether they're |
| 44 | +considered _"official"_ Working Groups. |
| 45 | + |
| 46 | +This RFC aims to provide clarity by providing new distinct terminology that |
| 47 | +matches the intent behind each of these three separate groups, as well as codify |
| 48 | +the processes that these groups have been using to help facilitate creating |
| 49 | +new groups. |
| 50 | + |
| 51 | +[rust-lang#54445]: https://github.com/rust-lang/rust/issues/54445 |
| 52 | + |
| 53 | +# Guide-level explanation |
| 54 | + |
| 55 | +To address this confusion this RFC proposes breaking up the single "Working |
| 56 | +Group" term, into three distinct terms. |
| 57 | + |
| 58 | +- **Working Group** would map most directly to the previous "Domain Working |
| 59 | + Group" terminology, focused on building and organising around new areas of |
| 60 | + Rust that aren't covered by the current team roster. |
| 61 | +- **Project Group** would replace the "Team Working Group", and would serve as a |
| 62 | + catch all term for sub teams for the existing teams to organise around |
| 63 | + specific efforts, such as certain project or effort in the Rust team. |
| 64 | +- **Community Group** would act as a catch all term for community self |
| 65 | + organising groups that are independent of the Rust Programming |
| 66 | + Language Organisation. |
| 67 | + |
| 68 | +## Life-cycle of a Project Group |
| 69 | + |
| 70 | +This is a high level overview of the complete process of a project group. While |
| 71 | +the flow is built around project groups, we expect that working groups would |
| 72 | +follow a similar process with only minor specifics changed. E.g. A working |
| 73 | +group does not have to find a liaison. |
| 74 | + |
| 75 | +<p align="center"> |
| 76 | + <img src="../resources/project-group-workflow.png" |
| 77 | + alt="A flow diagram showing each step of a project group" |
| 78 | + height="800px"> |
| 79 | + <p align="center">Figure 1. Project Group Lifecycle</p> |
| 80 | +</p> |
| 81 | + |
| 82 | +### Steps |
| 83 | + |
| 84 | +1. Exploratory period. |
| 85 | + |
| 86 | +- Initial discussions of the problem area. |
| 87 | +- Write a charter containing motivation, and some notes on |
| 88 | + possible solutions. |
| 89 | +- Find a person from the relevant team who's willing to act as a liaison. |
| 90 | + - Typically can find someone by creating a post on [internals] or pinging |
| 91 | + specific people from team to gauge their interest. |
| 92 | + |
| 93 | +2. Obtain consensus to create group. |
| 94 | + |
| 95 | +- Specify the liaison, and shepherd(s). |
| 96 | +- How consensus is reached would vary from team to team, some would require an |
| 97 | + RFC while others could decide in a meeting. (See [Future Work](#future-work)) |
| 98 | + |
| 99 | +3. Create infrastructure for group. |
| 100 | + |
| 101 | +- GitHub repository under `rust-lang` for hosting work and discussions, such |
| 102 | + as for draft RFCs. |
| 103 | +- A Discord channel or a Zulip stream for communication. |
| 104 | +- Project group in [`rust-lang/team`], as well as a team on GitHub, for |
| 105 | + handling permissions. |
| 106 | + |
| 107 | +4. Create a post on the Rust or Inside Rust blog announcing creation of |
| 108 | + the group. |
| 109 | + |
| 110 | +5. The group works towards the goals laid out in their charter. |
| 111 | + |
| 112 | +6. When active work has stopped a group is "archived". |
| 113 | + |
| 114 | +- Archival is not necessarily a permanent state, it is only a reflection on the current |
| 115 | + status of the group. A group can be "restored" at a later stage. |
| 116 | +- Reasons to archive: |
| 117 | + - Nobody in the group has time anymore or higher priority things arose. |
| 118 | + - There's a blocking issue that can't be resolved. |
| 119 | + - Don't see any additional work to do in this area in the near future. |
| 120 | + - The work was done to a satisfactory state. |
| 121 | + - The group decided the idea wasn't so good after all. |
| 122 | + |
| 123 | +7. Create a blog post announcing the archival of the group. |
| 124 | + |
| 125 | +- The scope of this post will vary based on the scope of the group, but |
| 126 | + ideally it would include some of the following. |
| 127 | + - Overview of decisions, RFCs, and other output the group produced. |
| 128 | + - Thoughts on the process, how it worked (or didn't as case may be), any |
| 129 | + difficulties encountered, and what they would want to be improved. |
| 130 | + |
| 131 | +8. Archive infrastructure. |
| 132 | + |
| 133 | +- Archive GitHub repository to be read-only. |
| 134 | +- Archive chat channel(s) on any platforms. |
| 135 | + |
| 136 | +9. (Optional) Restore group |
| 137 | + |
| 138 | +- At any later point the group could be restored to active status if there are |
| 139 | + assigned liaisons and shepherds, and the group has consensus from the team |
| 140 | + that the group should become active again. |
| 141 | +- If significant time has passed, part of restoring the group should be to |
| 142 | + evaluate whether the past decisions and rationale are still applicable to the |
| 143 | + present. |
| 144 | +- If there is consensus to become active again, go to step 3. |
| 145 | + |
| 146 | +[`rust-lang/team`]: https://github.com/rust-lang/team |
| 147 | +[internals]: https://internals.rust-lang.org |
| 148 | + |
| 149 | +# Reference-level explanation |
| 150 | + |
| 151 | +## Common Aspects of Working Groups and Project Groups |
| 152 | + |
| 153 | +Before going into the differences between these groups it's important to start |
| 154 | +with what it is shared between them. |
| 155 | + |
| 156 | +- A charter that defines the scope and intent of the group. |
| 157 | + |
| 158 | +- A GitHub repository hosted under the `rust-lang` organization |
| 159 | + (or separate organisation if necessary) containing the charter and |
| 160 | + instructions for how community members can monitor or participate in |
| 161 | + the group. |
| 162 | + |
| 163 | +- Groups have at least one shepherd who acts as the leader of the group and is |
| 164 | + typically responsible for writing the initial charter, handling administrative |
| 165 | + and communication tasks, as well as delegating responsibilities to other |
| 166 | + members in the group. |
| 167 | + |
| 168 | +- Groups should have a liaison member associated with an official Rust team. |
| 169 | + |
| 170 | + - This liaison may also be but is not required to be a shepherd. |
| 171 | + |
| 172 | +- Groups and their members are represented on the official |
| 173 | + [rust-lang.org] website. |
| 174 | + |
| 175 | +- Membership requirements for both groups is decided by the shepherd and should |
| 176 | + be stated in the charter. |
| 177 | + |
| 178 | + - Initial membership should try to represent people who have already been |
| 179 | + participating regularly and productively in the respective area. |
| 180 | + |
| 181 | +- Neither group has _"formal decision making power"_: meaning that they are not |
| 182 | + able to accept RFCs on `rust-lang/rfcs`. Similarly, neither group has |
| 183 | + representation on the Core team. |
| 184 | + |
| 185 | + - Groups are of course encouraged to create RFCs as well |
| 186 | + as advocate their concerns and desired changes to the Rust teams |
| 187 | + and community. |
| 188 | + |
| 189 | +- Both groups are entitled to spaces in any or all of Rust's officially managed |
| 190 | + discussion forums. |
| 191 | + |
| 192 | + - As the time of this writing this includes [Zulip] and [Discord]. |
| 193 | + - Groups are also free to create spaces on platforms where the Rust project |
| 194 | + does not have a official presence. Moderation for these spaces should still |
| 195 | + follow Rust's [Code of Conduct]. |
| 196 | + |
| 197 | +[rust-lang.org]: https://rust-lang.org |
| 198 | +[zulip]: https://rust-lang.zulipchat.com |
| 199 | +[discord]: https://discord.gg/rust-lang |
| 200 | +[code of conduct]: https://www.rust-lang.org/policies/code-of-conduct |
| 201 | + |
| 202 | +### Initial Setup |
| 203 | + |
| 204 | +Once a group has been approved, a pull request with the initial set of members |
| 205 | +should be made to [`rust-lang/team`]. Please refer to team's documentation for |
| 206 | +how to create a group. |
| 207 | + |
| 208 | +It is recommended for the working group to create a `wg-{name}`/`project-{name}` |
| 209 | +repository under the `rust-lang` organisation using the [project group |
| 210 | +template], and making any relevant changes and personalisation. |
| 211 | + |
| 212 | +[`rust-lang/team`]: https://github.com/rust-lang/team |
| 213 | +[project group template]: https://github.com/rust-lang/project-group-template |
| 214 | + |
| 215 | +## Working Groups |
| 216 | + |
| 217 | +Working groups are a way of finding new domains that would benefit from |
| 218 | +continual development, that are not covered by an existing Rust team. Examples |
| 219 | +of this include [Embedded][embedded-wg], [WebAssembly][wasm-wg], and |
| 220 | +[Game Development][gamedev-wg]. |
| 221 | + |
| 222 | +[embedded-wg]: https://github.com/rust-embedded/wg |
| 223 | +[wasm-wg]: https://github.com/rustwasm/team |
| 224 | +[gamedev-wg]: https://github.com/rust-gamedev/wg |
| 225 | + |
| 226 | +### Working Group Creation |
| 227 | + |
| 228 | +Creation of a working group is approved by the core team. Typically this has |
| 229 | +been done by the core team agreeing to approve the creation of new working |
| 230 | +groups, having a period of time soliciting applications from the community, |
| 231 | +and then approving a subset of those applications. |
| 232 | + |
| 233 | +#### Application Checklist |
| 234 | + |
| 235 | +This not meant to be formal list of questions to be answer, however the |
| 236 | +application should try to address these points. |
| 237 | + |
| 238 | +- What value do you see your group bringing to the organisation? |
| 239 | +- What are the goals of your group? |
| 240 | +- What are explicitly non-goals of your group? |
| 241 | + |
| 242 | +These first three points should also serve as the basis for the charter for the |
| 243 | +working group. |
| 244 | + |
| 245 | +- Is your group long-running or temporary? |
| 246 | + - If it is temporary, how long do you see it running for? |
| 247 | +- What is the long-term vision of your group? |
| 248 | +- What do you expect the relationship to the organisation be? |
| 249 | +- How do you want to establish accountability? |
| 250 | +- If applicable, which other working groups or teams do you expect to have close |
| 251 | + contact with? |
| 252 | +- What are the short-term goals of your group? |
| 253 | +- Who are the initial shepherds/leaders? (This is preferably 2–3 individuals, |
| 254 | + but not required.) |
| 255 | +- How do you intend to make your work accessible to people outside your group? |
| 256 | +- Where do you see your group needing help? |
| 257 | +- What is your preferred way for the core team to contact you? |
| 258 | + |
| 259 | +### Working Group Evaluation |
| 260 | + |
| 261 | +Working group shepherds should be regularly participating in the project leads |
| 262 | +discussion channels so that the rest of the organisation is aware of the work |
| 263 | +and can help where needed. |
| 264 | + |
| 265 | +If a working group has demonstrated consistent productivity over a significant |
| 266 | +period time, and there is consensus that there is significant future work, it |
| 267 | +may become a Rust team. Conversely if there is consensus that the work is |
| 268 | +"complete" to the point that there's there is little benefit to continuing the |
| 269 | +working group, it may be archived. |
| 270 | + |
| 271 | +## Project Groups |
| 272 | + |
| 273 | +A Project Group is a group of people working on a particular project or |
| 274 | +responsibilities at the behest of an official Rust team. Some project groups are |
| 275 | +are ephemeral, meaning that they are archived once the project is complete. |
| 276 | +However, there are projects that have continual work and maintenance. |
| 277 | + |
| 278 | +Examples of project groups around specific feature include [FFI Unwind], |
| 279 | +[Inline ASM], and [Safe Transmute]. Examples built around continual work and |
| 280 | +maintenance would include [Triage], and [Rustup]. |
| 281 | + |
| 282 | +The goal of a project is build a community or formalise and existing community |
| 283 | +around a particular feature or project in the in the organisation, and use this |
| 284 | +space to discuss and iterate on that feature. |
| 285 | + |
| 286 | +Part of building a community is removing some of the institutional memory that |
| 287 | +develops in the design process, and centralising the information and discussion |
| 288 | +around the feature so that we can provide better visibility into why certain |
| 289 | +decisions and trade offs were made over others. |
| 290 | + |
| 291 | +Previously a lot of the discussion and iteration for large features would |
| 292 | +happen in the initial RFC thread. This leads to a lot of discussion in the top |
| 293 | +of the thread and that has can become completely irrelevant to the current |
| 294 | +iteration. |
| 295 | + |
| 296 | +This process has also been unsuitable to describe features that can take |
| 297 | +multiple years to develop and will become multiple RFCs over the course of its |
| 298 | +design process. Some examples of of this are the "`impl Trait`" and "macros |
| 299 | +2.0" features, where the goals has shifted a lot from the initial RFCs, and it |
| 300 | +can be hard to know their current status. |
| 301 | + |
| 302 | +[ffi unwind]: https://github.com/rust-lang/project-ffi-unwind |
| 303 | +[inline asm]: https://github.com/rust-lang/project-inline-asm |
| 304 | +[safe transmute]: https://github.com/rust-lang/project-safe-transmute |
| 305 | +[triage]: https://github.com/rust-lang/team/blob/master/teams/wg-triage.toml |
| 306 | +[rustup]: https://github.com/rust-lang/team/blob/master/teams/wg-rustup.toml |
| 307 | + |
| 308 | +### Project Group Creation |
| 309 | + |
| 310 | +Since project groups are approved by their relevant parent team over the core |
| 311 | +team, it's up to each team decide their specific requirements. However we |
| 312 | +recommend using the [application checklist](#application-checklist) as the basis |
| 313 | +for process and if needed adding any extra requirements. |
| 314 | + |
| 315 | +Process around project group membership is up to the shepherd's discretion. |
| 316 | +Typically, people who are productively contributing to the project group for |
| 317 | +some time will be added as members. It is not required for a project group to |
| 318 | +have a lot of members though, some project groups may only have one or |
| 319 | +two members. |
| 320 | + |
| 321 | +### Project Group Evaluation |
| 322 | + |
| 323 | +Parent teams should add checking in with their project groups as part of their |
| 324 | +regular triage. |
| 325 | + |
| 326 | +## Community Groups |
| 327 | + |
| 328 | +Community Groups are groups of individuals who want to work and collaborate on a |
| 329 | +specific topic, without going through the formal process of a working group. |
| 330 | +Community groups are encouraged to adopt the structure of working or projects |
| 331 | +groups laid, but are free create and experiment with their own structure. As |
| 332 | +such community groups are not officially endorsed by The Rust Programming |
| 333 | +Language Organisation. |
| 334 | + |
| 335 | +## Archival |
| 336 | + |
| 337 | +The archival process of a group involves communicating the wind down to the |
| 338 | +community and the archival or transfer of ownership of the relevant projects. |
| 339 | +As well archiving any chat channels hosted by the Rust project. |
| 340 | + |
| 341 | +### Retrospectives |
| 342 | + |
| 343 | +While this RFC attempts to address some of the current organisational problems |
| 344 | +within the organisation, it also doesn't believe that this RFC will be a panacea |
| 345 | +to those problems or that we won't encounter more in the future. As part of |
| 346 | +that, we'd also like to introduce performing retrospectives with groups, once |
| 347 | +significant time has past or the group has been finished it's project. |
| 348 | + |
| 349 | +This would involve a discussion between the members of the group, and ideally |
| 350 | +their parent team and the Governance working group. The retrospective should |
| 351 | +produce a public blog post on the Inside Rust blog, however any feedback a |
| 352 | +member has that they would want to keep private would be omitted. |
| 353 | + |
| 354 | +The blog post should try to cover the output of the group, such as RFCs or |
| 355 | +projects, as well what the group thought worked and importantly what |
| 356 | +didn't work. This should help us iterate on this initial RFC and help us find |
| 357 | +and address issues that come up in the process. |
| 358 | + |
| 359 | +# Drawbacks |
| 360 | + |
| 361 | +- This will add organisational overhead to maintain group repositories |
| 362 | + and documents. |
| 363 | +- There's a lot of inertia around the Working Group terminology, and switching |
| 364 | + to new terminology will likely also cause some confusion, though hopefully |
| 365 | + only in the short term. |
| 366 | + |
| 367 | +# Future Work |
| 368 | + |
| 369 | +- Ideally we'd prefer if every team obtained consensus to form groups through |
| 370 | + RFCs, as they an open process that allows us to easily keep track of |
| 371 | + decisions. However we recognise that the current RFC process is maybe too |
| 372 | + heavyweight for some teams currently. We're currently looking how we can |
| 373 | + simplify some of this process, see [wg-governance#38] for further information. |
| 374 | + |
| 375 | +[wg-governance#38]: https://github.com/rust-lang/wg-governance/issues/38 |
| 376 | + |
| 377 | +# Unresolved questions |
| 378 | + |
| 379 | +[unresolved-questions]: #unresolved-questions |
| 380 | + |
| 381 | +- The term _"shepherd"_ term has been used extensively in the Rust project and |
| 382 | + the community to describe leaders of teams however there hasn't ever been a |
| 383 | + strict definition and this could come with different expectations of what is |
| 384 | + expected from a shepherd. This RFC does not attempt to define this, however |
| 385 | + there are few resources that are helpful to understanding the terminology. |
| 386 | + |
| 387 | +> - [Niko Matsakis' "AiC: Shepherds 3.0"][niko-sheps] |
| 388 | +> - [James Munns' "Shepherding v3.1"][james-sheps] |
| 389 | +
|
| 390 | +[niko-sheps]: http://smallcultfollowing.com/babysteps/blog/2019/09/11/aic-shepherds-3-0/ |
| 391 | +[james-sheps]: https://jamesmunns.com/blog/shepherding-3-1/ |
0 commit comments