Skip to content

Commit 72eceed

Browse files
committed
docs(rfc): require issues before RFCs
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
1 parent ec197a4 commit 72eceed

6 files changed

Lines changed: 37 additions & 25 deletions

File tree

.github/ISSUE_TEMPLATE/feature_request.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ body:
77
value: |
88
## Design-First Feature Proposals
99
10-
OpenShell feature requests must include a design proposal — describe the system behavior you want, not just the outcome. If your agent explored the codebase to assess feasibility (e.g., using the `create-spike` skill), include its findings.
10+
OpenShell feature requests must include a design proposal — describe the system behavior you want, not just the outcome. New features start here, not as RFC pull requests. If maintainers decide an RFC is necessary, they will request one from this issue and assign the RFC number.
11+
12+
If your agent explored the codebase to assess feasibility (e.g., using the `create-spike` skill), include its findings.
1113
1214
- type: textarea
1315
id: problem

AGENTS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ These pipelines connect skills into end-to-end workflows. Individual skill files
6262

6363
- **Bug reports** must include an agent diagnostic section — proof that the reporter's agent investigated the issue before filing. See the issue template.
6464
- **Feature requests** must include a design proposal, not just a "please build this" request. See the issue template.
65+
- **New features** must start as GitHub issues using the feature request template. Open an RFC only after an issue exists; maintainers decide when one is needed and assign RFC numbers from the issue.
6566
- **PRs** must follow the PR template structure: Summary, Related Issue, Changes, Testing, Checklist.
6667
- **PRs from unvouched external contributors** are automatically closed. See the Vouch System section above.
6768
- **Security vulnerabilities** must NOT be filed as GitHub issues. Follow [SECURITY.md](SECURITY.md).

CONTRIBUTING.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ These are the primary `mise` tasks for day-to-day development:
223223

224224
## RFCs
225225

226-
For cross-cutting architectural decisions, API contract changes, or process proposals that need broad consensus, use the RFC process. RFCs live in `rfc/` — copy the template, fill it in, and open a PR for discussion. See [rfc/README.md](rfc/README.md) for the full lifecycle and guidelines on when to write an RFC versus a spike issue or architecture doc.
226+
New features always start as GitHub issues using the feature request template. For cross-cutting architectural decisions, API contract changes, or process proposals that need broad consensus, maintainers may ask for an RFC from the issue and assign an RFC number there. RFCs live in `rfc/`, but they should be uncommon. See [rfc/README.md](rfc/README.md) for the full lifecycle and guidelines on when an issue should become an RFC versus a spike issue or architecture doc.
227227

228228
## Documentation
229229

architecture/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,8 @@ that crate's `README.md`.
169169

170170
## `rfc/` vs `architecture/`
171171

172-
For broad design proposals, use `rfc/`. Once an RFC is adopted, appropriate details should be written back to architecture docs.
172+
Broad design proposals start as GitHub issues. If maintainers decide a proposal needs broad consensus, they assign an RFC number from the issue and the RFC lives in `rfc/`. Once an RFC is adopted, appropriate details should be written back to architecture docs.
173173

174174
`architecture/` serves as the canonical reference for OpenShell's design and architecture.
175175

176-
`rfc` serves to help facilitate discussion and ensure features are appropriately designed. These are useful for understanding the context in which certain architecture designs were made.
176+
`rfc` serves to help facilitate discussion and ensure the few changes that need that level of review are appropriately designed. These are useful for understanding the context in which certain architecture designs were made.

rfc/0000-template/README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@ authors:
33
- "@your-github-username"
44
state: draft
55
links:
6-
- (related PRs or issues)
6+
- (originating GitHub issue where maintainers assigned this RFC number)
77
---
88

99
# RFC NNNN - Your Title Here
1010

1111
<!--
12-
See rfc/README.md for the full RFC process and state definitions.
12+
See rfc/README.md for the full RFC process and state definitions. Do not
13+
create an RFC until a GitHub issue exists and maintainers have assigned the
14+
RFC number from that issue.
1315
-->
1416

1517
## Summary

rfc/README.md

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,36 @@
11
# OpenShell RFCs
22

3-
Substantial changes to OpenShell should be proposed in writing before implementation begins. An RFC provides a consistent way to propose an idea, collect feedback from the community, build consensus, and document the decision for future contributors. Not every change needs an RFC — bug fixes, small features, and routine maintenance go through normal pull requests. RFCs are for the changes that are cross-cutting, potentially controversial, or significant enough that stakeholders should weigh in before code is written.
3+
Substantial changes to OpenShell should be proposed in writing before implementation begins. New features always start as a GitHub issue using the [feature request template](https://github.com/NVIDIA/OpenShell/issues/new/choose), not as an RFC pull request. Most proposals should stay in the issue, spike, and pull request workflow. RFCs are intentionally rare and are reserved for changes that are cross-cutting, potentially controversial, or significant enough that stakeholders should weigh in before code is written.
4+
5+
An RFC provides a consistent way to collect broad feedback, build consensus, and document the decision for future contributors. An RFC is created only when maintainers decide the originating issue needs that level of design review.
46

57
## Start with a GitHub issue
68

7-
Before writing an RFC, consider opening a [GitHub issue](https://github.com/NVIDIA/OpenShell/issues/new/choose) to scope the problem, gauge interest, and get early feedback. This helps:
9+
Before writing an RFC, you must open a [GitHub issue](https://github.com/NVIDIA/OpenShell/issues/new/choose) to scope the problem, gauge interest, and get early feedback. For new features, use the feature request template. This helps:
810

911
- Validate that the problem is worth solving
1012
- Surface potential concerns early
1113
- Build consensus before investing in a detailed proposal
1214
- Identify the right reviewers and stakeholders
1315

14-
If the ticket shows sufficient interest and the idea has merit, then it's time to write an RFC to detail the plan and technical approach.
16+
If the ticket shows sufficient interest and maintainers decide the idea needs broad design review, they will ask for an RFC from that issue. Maintainers assign the RFC number in the issue before the RFC is created, preventing number clashes across branches.
1517

1618
## RFCs vs other artifacts
1719

1820
OpenShell has several places where design information lives. Use this guide to pick the right one:
1921

2022
| Artifact | Purpose | When to use |
2123
|----------|---------|-------------|
22-
| **GitHub issue** | Track and scope a rough idea | You have a thought but aren't sure it's worth a proposal yet |
24+
| **GitHub issue** | Track and scope a bug, feature request, or rough idea | Always start here; new features use the feature request template |
2325
| **Spike issue** (`create-spike`) | Investigate implementation feasibility for a scoped change | You need to explore the codebase and produce a buildable issue for a specific component or feature |
24-
| **RFC** | Propose a cross-cutting decision that needs broad consensus | Architectural changes, API contracts, process changes, or anything that spans multiple components or teams |
26+
| **RFC** | Propose a cross-cutting decision that needs broad consensus | Maintainers requested an RFC from an existing issue and assigned an RFC number |
2527
| **Architecture doc** (`architecture/`) | Document how things work today | Living reference material — updated as the system evolves |
2628

2729
The key distinction: **spikes investigate whether and how something can be done; RFCs propose that we should do it and seek agreement on the approach.** A spike may precede an RFC (to gather data) or follow one (to flesh out implementation details). When an RFC reaches `implemented`, its relevant content should be folded into the appropriate `architecture/` docs so the living reference stays current.
2830

2931
## When to use an RFC
3032

31-
The following are examples of when an RFC is appropriate:
33+
RFCs should be uncommon. The following are examples of when maintainers may ask for one after an issue is opened:
3234

3335
- An architectural or design decision for the platform
3436
- Change to an API or command-line tool
@@ -44,11 +46,12 @@ Not everything needs an RFC. Skip the RFC process for:
4446

4547
- Bug fixes
4648
- Small feature additions scoped to a single component (use a spike instead)
49+
- Feature requests that can be resolved through the issue, spike, and pull request workflow
4750
- Documentation changes
4851
- Dependency updates
4952
- Refactoring that doesn't change public interfaces
5053

51-
If a change doesn't require cross-team consensus, a spike issue is the right vehicle.
54+
If a change doesn't require cross-team consensus, a GitHub issue or spike issue is the right vehicle.
5255

5356
## RFC metadata and state
5457

@@ -60,16 +63,16 @@ authors:
6063
- "@username"
6164
state: draft
6265
links:
63-
- https://github.com/NVIDIA/OpenShell/pull/123
6466
- https://github.com/NVIDIA/OpenShell/issues/456
67+
- https://github.com/NVIDIA/OpenShell/pull/123
6568
---
6669
```
6770

6871
We track the following metadata:
6972

7073
- **authors**: The authors (and therefore owners) of an RFC. Listed as GitHub usernames.
7174
- **state**: Must be one of the states discussed below.
72-
- **links**: Related PRs or issues. Add entries as the RFC progresses.
75+
- **links**: Related PRs or issues. The first link should be the originating issue where maintainers requested the RFC and assigned its number. Add entries as the RFC progresses.
7376
- **superseded_by**: *(optional)* For RFCs in the `superseded` state, the RFC number that replaces this one (e.g., `0005`).
7477

7578
An RFC can be in one of the following states:
@@ -85,11 +88,15 @@ An RFC can be in one of the following states:
8588

8689
## RFC lifecycle
8790

88-
### 1. Reserve an RFC number
91+
### 1. Open a GitHub issue
92+
93+
Start with a GitHub issue. New features must use the feature request template and include enough design context for maintainers and contributors to evaluate the idea. Do not open an RFC PR before an issue exists.
94+
95+
### 2. Get maintainer confirmation
8996

90-
Look at the existing RFC folders in this directory and choose the next available number. If two authors happen to pick the same number on separate branches, the conflict is resolved during PR review — the later PR simply picks the next available number.
97+
Maintainers decide from the issue whether an RFC is necessary. If it is, they assign the RFC number in the issue before anyone creates the RFC branch or folder. Authors should use the assigned number instead of choosing one locally.
9198

92-
### 2. Create your RFC
99+
### 3. Create your RFC
93100

94101
Each RFC lives in its own folder:
95102

@@ -99,35 +106,35 @@ rfc/NNNN-my-feature/
99106
(optional: diagrams, images, supporting files)
100107
```
101108

102-
Where `NNNN` is your RFC number (zero-padded to 4 digits) and `my-feature` is a short descriptive name. The main proposal goes in `README.md` so GitHub renders it when browsing the folder.
109+
Where `NNNN` is the maintainer-assigned RFC number (zero-padded to 4 digits) and `my-feature` is a short descriptive name. The main proposal goes in `README.md` so GitHub renders it when browsing the folder.
103110

104111
To start a new RFC, copy the template folder:
105112

106113
```shell
107114
cp -r rfc/0000-template rfc/NNNN-my-feature
108115
```
109116

110-
Fill in the metadata and start writing. The state should be `draft` while you're iterating.
117+
Fill in the metadata, include the originating issue in `links`, and start writing. The state should be `draft` while you're iterating.
111118

112-
### 3. Open a pull request
119+
### 4. Open a pull request
113120

114-
When you're ready for feedback, update the state to `review` and open a pull request. Add the PR link to the `pr` field in the metadata.
121+
When you're ready for feedback, update the state to `review` and open a pull request. Add the PR link to `links` in the metadata.
115122

116123
The PR is where discussion happens. Anyone subscribed to the repo will get a notification and can read your RFC and provide feedback.
117124

118-
### 4. Iterate and build consensus
125+
### 5. Iterate and build consensus
119126

120127
The comments you choose to accept are up to you as the owner of the RFC, but you should remain empathetic in how you engage. For those giving feedback, be sure that all feedback is constructive.
121128

122129
RFCs rarely go through this process unchanged. Make edits as new commits to the PR and leave comments explaining your changes.
123130

124-
### 5. Merge the pull request
131+
### 6. Merge the pull request
125132

126133
After there has been time for folks to comment, the RFC author requests merge and a maintainer approves and merges. The state should be updated from `review` to `accepted`. If the proposal is declined, the state should be set to `rejected`. The timing is left to the author's discretion. As a guideline, a few business days seems reasonable, but circumstances may dictate a different timeline.
127134

128135
In general, RFCs shouldn't be merged if no one else has read or commented on it. If no one is reading your RFC, it's time to explicitly ask someone to give it a read!
129136

130-
### 6. Implementation
137+
### 7. Implementation
131138

132139
Once an RFC has been entirely implemented, its state should be moved to `implemented`. This represents ideas that have been fully developed. While discussion on implemented RFCs is permitted, changes would be expected to be infrequent.
133140

0 commit comments

Comments
 (0)