Skip to content

Adopt the CEP process #1

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 30 commits into from
Aug 21, 2020
Merged
Show file tree
Hide file tree
Changes from 19 commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
f7799db
Import intial template, copied from https://github.com/rust-lang/rfcs
marc-casperlabs Aug 15, 2020
f149c7f
Alter template to suitable for CasperLabs projects
marc-casperlabs Aug 15, 2020
dc5b5b5
Create first draft of RFC creation RFC
marc-casperlabs Aug 15, 2020
92fd1d7
RFC0001 is adopt-rfc-process
marc-casperlabs Aug 15, 2020
5e0a343
Move creation of the "rendered" link to after assigning a number
marc-casperlabs Aug 15, 2020
f36d349
Add note about keeping discussions on GitHub
marc-casperlabs Aug 15, 2020
a242240
Fix markdown lint issue in `README.md`
marc-casperlabs Aug 15, 2020
01f325e
Change delimiter for bullet point from `-` to `*`
marc-casperlabs Aug 16, 2020
7aa1ea1
Note drawback of not being able to assign RFC beforehand
marc-casperlabs Aug 16, 2020
ca8c135
Change all references of RFCs to CEPs
marc-casperlabs Aug 18, 2020
a8150a4
Define CEP in the `README.md`
marc-casperlabs Aug 18, 2020
c60c6c1
Fix spelling mistakes stemming from RFC->CEP rename
marc-casperlabs Aug 18, 2020
e1ecf16
Update text/0001-adopt-cep-process.md
marc-casperlabs Aug 19, 2020
45f03c5
Update text/0001-adopt-cep-process.md
marc-casperlabs Aug 19, 2020
60d1a10
Update text/0001-adopt-cep-process.md
marc-casperlabs Aug 19, 2020
cd7e93a
Update text/0001-adopt-cep-process.md
marc-casperlabs Aug 19, 2020
8611ecd
Update text/0001-adopt-cep-process.md
marc-casperlabs Aug 19, 2020
d89f44e
Update text/0001-adopt-cep-process.md
marc-casperlabs Aug 19, 2020
8747a76
Update text/0001-adopt-cep-process.md
marc-casperlabs Aug 19, 2020
db14135
Update text/0001-adopt-cep-process.md
marc-casperlabs Aug 20, 2020
108ed5e
Update text/0001-adopt-cep-process.md
marc-casperlabs Aug 20, 2020
b4d02a6
Update 0000-template.md
marc-casperlabs Aug 20, 2020
96d0639
Update text/0001-adopt-cep-process.md
marc-casperlabs Aug 20, 2020
ee32ec4
Update text/0001-adopt-cep-process.md
marc-casperlabs Aug 20, 2020
fd03be3
Update 0000-template.md
marc-casperlabs Aug 20, 2020
b4600d8
Make it clear that we are creating a PR only for a CEP with some subs…
marc-casperlabs Aug 21, 2020
8513ebd
Fix some whitespace errors
marc-casperlabs Aug 21, 2020
851c580
Add `LICENSE` file
marc-casperlabs Aug 21, 2020
45e354b
Replace `README.md` with link to `CEP0001`
marc-casperlabs Aug 21, 2020
3f48b41
No more pirate code
marc-casperlabs Aug 21, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 87 additions & 0 deletions 0000-template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
# Title

## Summary

[summary]: #summary

CEP PR: [casperlabs/ceps#0000](https://github.com/casperlabs/ceps/pull/0000)

One paragraph explanation of the feature.

## Motivation

[motivation]: #motivation

Why are we doing this? What use cases does it support? What is the expected outcome?

## Guide-level explanation

[guide-level-explanation]: #guide-level-explanation

Explain the proposal as if it was already approved and implemented. That generally means:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Having started in on CEP-0003, I now realise that this is confusing.

The case in point is the sentence "In general, any serialized object is prefixed with a short tag indicating its type, regardless of the chosen serialization format."

I immediately thought "that's wrong", wasted some time writing a comment with examples to point out the error, and then realised further on that you meant that any serialized object should be prefixed by a tag.

Don't you think it'd be more natural to describe the proposed changes as proposed changes rather than changes which have already happened? I'd imagine most CEPs will want to refer to the current state of the code, and that will be difficult to disambiguate from changes suggested in the CEP if we adopt this style.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I genuinely don't know, this is copied from the Rust project almost verbatim. It has the nice benefit of stating the actual status quo once it becomes implemented (and then being obsolete again when outdated ;))

How strongly do you feel about this? I can see your points, but they would take a little getting used to. On the other hand, I am assuming the Rust project does it this way for a reason...

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't feel overly strongly, but it's surprising the Rust project specifies it. I glanced at a couple of their RFCs and found them to be talking in terms of "should be", "will be", etc. rather than "is".

Maybe this is just one of those rules which makes so little sense that nobody actually follows it?

Either way, I'm happy to leave this if you prefer and we can always revisit in the future.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe this is just one of those rules which makes so little sense that nobody actually follows it?

I certainly won't fault anyone for doing so. It's a bit counterintuitive, for sure.


- Introducing new named concepts.
- Explaining the feature largely in terms of examples.

For implementation-oriented CEPs (e.g. for node internals), this section should focus on how other developers should think about the change, and give examples of its concrete impact. For policy CEPs, this section should provide an example-driven introduction to the policy, and explain its impact in concrete terms.

## Reference-level explanation

[reference-level-explanation]: #reference-level-explanation

This is the technical portion of the CEP. Explain the design in sufficient detail that:

- Its interaction with other features is clear.
- It is reasonably clear how the feature would be implemented.
- Corner cases are dissected by example.

The section should return to the examples given in the previous section, and explain more fully how the detailed proposal makes those examples work.

## Drawbacks

[drawbacks]: #drawbacks

Why should we *not* do this?

## Rationale and alternatives

[rationale-and-alternatives]: #rationale-and-alternatives

- Why is this design the best in the space of possible designs?
- What other designs have been considered and what is the rationale for not choosing them?
- What is the impact of not doing this?

A very important thing to list here is ideas that were discarded in the process, as these tend to crop up again after a while. Describing them here saves time as it allows people discussing those ideas again in the future to point to refer to this document.

## Prior art

[prior-art]: #prior-art

Discuss prior art, both the good and the bad, in relation to this proposal.
A few examples of what this can include are:

- For development focused proposals: Does this feature exist in other applications and what experience have their community had?
- For community proposals: Is this done by some other community and what were their experiences with it?
- For other teams: What lessons can we learn from what other communities have done here?
- Papers: Are there any published papers or great posts that discuss this? If you have some relevant papers to refer to, this can serve as a more detailed theoretical background.

This section is intended to encourage you as an author to think about the lessons from other languages, provide readers of your CEP with a fuller picture.

## Unresolved questions

[unresolved-questions]: #unresolved-questions

- What parts of the design do you expect to resolve through the CEP process before this gets merged?
- What related issues do you consider out of scope for this CEP that could be addressed in the future independently of the solution that comes out of this CEP?

## Future possibilities

[future-possibilities]: #future-possibilities

Think about what the natural extension and evolution of your proposal would be and how it would affect the project as a whole in a holistic way. Try to use this section as a tool to more fully consider all possible interactions with the project and language in your proposal. Also consider how the this all fits into the roadmap for the project and of the relevant sub-team.

This is also a good place to "dump ideas", if they are out of scope for the CEP you are writing but otherwise related.

If you have tried and cannot think of any future possibilities, you may simply state that you cannot think of anything.

Note that having something written down in the future-possibilities section is not a reason to accept the current or a future CEP; such notes should be in the section on motivation or rationale in this or subsequent CEPs. The section merely provides additional information.
8 changes: 6 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# RFCs
# Casper Enhancement Proposals

This is an empty repository. Content will follow soon.
Please see [CEP0001](text/0001-adopt-cep-process.md) on how to create a CEP.

## Copyright

The `0000-template.md` file has been taken from the [Rust RFCs](https://github.com/rust-lang/rfcs) repository and is licensed under the MIT license. Please see the linked repository for the original file and licensing details.
86 changes: 86 additions & 0 deletions text/0001-adopt-cep-process.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
# Adopt the CEP process

## Summary

[summary]: #summary

CEP PR: [casperlabs/ceps#0001](https://github.com/casperlabs/ceps/pull/0001)

Make specifications, ideas and implementation guidelines more developer friendly and accessible through the introduction of an easy to use CEPs process.

## Motivation

[motivation]: #motivation

To standardize on a single unified process for capturing and specifying proposals for enhancements to our software.

There is a need for a reasonably lightweight process to discuss and adopt ideas, not only on the tech side, but governance and economics as well. We want this process to serve those behind these ideas and those implementing them first, instead of being caught in project management tooling. If possible, it should also be friendly to outside contributors, setting a low barrier for them to contribute feedback or their own ideas.

Typical usecases are the discussion of refactoring or design decisions of the software, policies for governance, or schemes cooked up by the economics team.

By introducing a little bit of formality, we hope to keep these designs fun and stave off the introduction of more restrictive processes. Creating CEPs should be easy using Markdown and GitHub, tools that everyone is already familiar with.

We are largely based on the [Rust RFC process](https://github.com/rust-lang/rfcs), albeit simplified. This document will tell you all you need to know about creating a CEP.

## How to create a CEP

[guide-level-explanation]: #guide-level-explanation

Any CEP (short for "request for comments") starts out with an idea. Some ideas are small enough to be exhaustively discussed in a short Slack conversation before making it into a pull request, there is no need to create a CEP for these. However, if the discussions grows in size and requires feedback from multiple people, this is the process:

1. Fork the CEP repo at [casperlabs/ceps](https://github.com/casperlabs/ceps).
2. Create a new branch for your CEP on your private repo, name it accordingly, e.g. `my-new-proposal`.
3. Copy the `0000-template.md` from the root to `text/0000-my-new-proposal.md`.
4. Edit the file, creating the first draft of the CEP.
5. Create a pull request to the CEP repo at [casperlabs/ceps](https://github.com/casperlabs/ceps). This PR will have a number, which is the official CEP number.
6. Add one commit immediately that updates the file name and links inside the CEP with the assigned number. Afterwards, add a "Rendered" link pointing to the branch-latest file via GitHub on your CEPs branch for easier reading (e.g. `https://github.com/yourgitusername/CEPs/blob/my-new-proposal/text/1234-my-new-proposal.md`)

### Discussion and merging

The CEP now enters the discussion period. Invite people to review it by requesting reviews and/or messaging them directly. The ensuing discussion may result in proposed changes, which should be addressed through additional commits.

Feedback and comments to the PR should be handled via GitHub to capture the discussion for later reference.

Once a CEP is finished and has at least one approval, it can be merged. When deciding whose approvals are required for a merge, there is no hard rule - instead think about the teams impacted by this change and try to get at least one representative of each to sign off on this. If you do not know whom to invite, ask anyone in the project for a suitable reviewer.

The prescribed process ends here. How proposed features and changes make it into the product is currently unspecified.

### Free-form

Note that the process is somewhat free-form, this very first CEP already deviates from the template. The latter, like the pirate code, should be seen as more of a guideline than a hard rule.

## Drawbacks

[drawbacks]: #drawbacks

The goal of this process is to unify and replace previous approaches on other content sharing platforms. If the other previous approaches are not abandoned in favor of this one, this attempt at unification will effectively be dead on arrival having merely exacerbated the problem it was meant to solve.

Another is potential growth of the process, making it become cumbersome. Any extension to this CEP itself should keep this in mind.

While suggested, it is not possible to make the branch contain the CEP number, since it is assigned only by the time the PR is made, for which the branch already needs to exist. This is also why the seperate step updating the docs is required.

## Rationale and alternatives

[rationale-and-alternatives]: #rationale-and-alternatives

Some of the existing infrastructure could accomodate this process at least partially:

### Wiki/Confluence

The internal confluence or any other Wiki could also handle some of this process, however they are typically lacking the sophisticated change tracking that is inherit in revision control systems like git. While this feature typically comes with a UX hit due to complexity, the fact that all people working on the project are familiar with developer tools makes this a non-issue.

### docs.casperlabs.io

The docs repository is for outside-facing, polished documentation. People reading it are typically not concerned about new ideas that are still under discussion or not implemented yet, and do not want to read about refactorings of node internals.

## Prior art

[prior-art]: #prior-art

The process is heavily based on [Rust's RFC process](https://github.com/rust-lang/rfcs) process, which seems to have worked well for the project. Other projects like NEAR [have adopted a copy of it](https://github.com/nearprotocol/NEPs/) as well.

## Future possibilities

[future-possibilities]: #future-possibilities

Future work could include automating some tooling around the process, i.e. creating an automatic [mdbook](https://github.com/rust-lang/mdBook) and publishing it to GitHub pages.