You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: .github/ISSUE_TEMPLATE/feature_request.yml
+3-1Lines changed: 3 additions & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -7,7 +7,9 @@ body:
7
7
value: |
8
8
## Design-First Feature Proposals
9
9
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.
Copy file name to clipboardExpand all lines: AGENTS.md
+1Lines changed: 1 addition & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -62,6 +62,7 @@ These pipelines connect skills into end-to-end workflows. Individual skill files
62
62
63
63
-**Bug reports** must include an agent diagnostic section — proof that the reporter's agent investigated the issue before filing. See the issue template.
64
64
-**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.
65
66
-**PRs** must follow the PR template structure: Summary, Related Issue, Changes, Testing, Checklist.
66
67
-**PRs from unvouched external contributors** are automatically closed. See the Vouch System section above.
67
68
-**Security vulnerabilities** must NOT be filed as GitHub issues. Follow [SECURITY.md](SECURITY.md).
Copy file name to clipboardExpand all lines: CONTRIBUTING.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -223,7 +223,7 @@ These are the primary `mise` tasks for day-to-day development:
223
223
224
224
## RFCs
225
225
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.
Copy file name to clipboardExpand all lines: architecture/README.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -169,8 +169,8 @@ that crate's `README.md`.
169
169
170
170
## `rfc/` vs `architecture/`
171
171
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.
173
173
174
174
`architecture/` serves as the canonical reference for OpenShell's design and architecture.
175
175
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.
Copy file name to clipboardExpand all lines: rfc/README.md
+26-19Lines changed: 26 additions & 19 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,34 +1,36 @@
1
1
# OpenShell RFCs
2
2
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.
4
6
5
7
## Start with a GitHub issue
6
8
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:
8
10
9
11
- Validate that the problem is worth solving
10
12
- Surface potential concerns early
11
13
- Build consensus before investing in a detailed proposal
12
14
- Identify the right reviewers and stakeholders
13
15
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.
15
17
16
18
## RFCs vs other artifacts
17
19
18
20
OpenShell has several places where design information lives. Use this guide to pick the right one:
19
21
20
22
| Artifact | Purpose | When to use |
21
23
|----------|---------|-------------|
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|
23
25
|**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|
25
27
|**Architecture doc** (`architecture/`) | Document how things work today | Living reference material — updated as the system evolves |
26
28
27
29
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.
28
30
29
31
## When to use an RFC
30
32
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:
32
34
33
35
- An architectural or design decision for the platform
34
36
- Change to an API or command-line tool
@@ -44,11 +46,12 @@ Not everything needs an RFC. Skip the RFC process for:
44
46
45
47
- Bug fixes
46
48
- 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
47
50
- Documentation changes
48
51
- Dependency updates
49
52
- Refactoring that doesn't change public interfaces
50
53
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.
52
55
53
56
## RFC metadata and state
54
57
@@ -60,16 +63,16 @@ authors:
60
63
- "@username"
61
64
state: draft
62
65
links:
63
-
- https://github.com/NVIDIA/OpenShell/pull/123
64
66
- https://github.com/NVIDIA/OpenShell/issues/456
67
+
- https://github.com/NVIDIA/OpenShell/pull/123
65
68
---
66
69
```
67
70
68
71
We track the following metadata:
69
72
70
73
-**authors**: The authors (and therefore owners) of an RFC. Listed as GitHub usernames.
71
74
-**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.
73
76
-**superseded_by**: *(optional)* For RFCs in the `superseded` state, the RFC number that replaces this one (e.g., `0005`).
74
77
75
78
An RFC can be in one of the following states:
@@ -85,11 +88,15 @@ An RFC can be in one of the following states:
85
88
86
89
## RFC lifecycle
87
90
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
89
96
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.
91
98
92
-
### 2. Create your RFC
99
+
### 3. Create your RFC
93
100
94
101
Each RFC lives in its own folder:
95
102
@@ -99,35 +106,35 @@ rfc/NNNN-my-feature/
99
106
(optional: diagrams, images, supporting files)
100
107
```
101
108
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.
103
110
104
111
To start a new RFC, copy the template folder:
105
112
106
113
```shell
107
114
cp -r rfc/0000-template rfc/NNNN-my-feature
108
115
```
109
116
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.
111
118
112
-
### 3. Open a pull request
119
+
### 4. Open a pull request
113
120
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.
115
122
116
123
The PR is where discussion happens. Anyone subscribed to the repo will get a notification and can read your RFC and provide feedback.
117
124
118
-
### 4. Iterate and build consensus
125
+
### 5. Iterate and build consensus
119
126
120
127
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.
121
128
122
129
RFCs rarely go through this process unchanged. Make edits as new commits to the PR and leave comments explaining your changes.
123
130
124
-
### 5. Merge the pull request
131
+
### 6. Merge the pull request
125
132
126
133
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.
127
134
128
135
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!
129
136
130
-
### 6. Implementation
137
+
### 7. Implementation
131
138
132
139
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.
0 commit comments