Skip to content

Commit 183458c

Browse files
authored
RFC: EcoStd RFC Process (#1)
1 parent 6b59c31 commit 183458c

File tree

7 files changed

+754
-0
lines changed

7 files changed

+754
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
/.build
2+
[0-9][0-9][0-9][0-9]-*.html

CONTRIBUTORS.adoc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
= Contributors
2+
3+
== RFC Authors
4+
5+
* René Ferdinand Rivera Morell

README.adoc

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
= EcoStd RFCs
2+
:license: Creative Commons Attribution 4.0 International License (CC BY 4.0)
3+
:nofooter:
4+
:reproducible:
5+
:revdate: {docdate}
6+
:sectanchors:
7+
:sectnumlevels: 10
8+
:sectnums:
9+
:source-highlighter: rouge
10+
:toc-title: Contents
11+
:toc:
12+
:toclevels: 5
13+
:version-label!:
14+
15+
// TODO: Fill with "Design" section from 0001-rfc-process proposal below.
16+
17+
[#process]
18+
== Process
19+
20+
In order to add or make changes to the EcoStd standards one must get an RFC
21+
approved (i.e. proposed, discussed, voted on, and merged). Before following the
22+
steps below, make sure to read this entire process. As there are considerations
23+
to keep in mind that will improve the chances of your proposal being effective.
24+
The steps to submit an RFC are:
25+
26+
. Fork the https://github.com/ecostd/rfcs[RFCs repository].
27+
28+
. Copy the `src/00/00-template-adoc` (or `src/00/00-template-md` for
29+
Markdown
30+
footnote:gfm[GitHub Flavored Markdown (https://github.github.com/gfm/)])
31+
directory to `src/00/00-sliced-bread` (change `sliced-bread` to
32+
something short, but descriptive).
33+
34+
. Write your RFC in the `proposal.adoc` (or `proposal.md` for Markdown
35+
footnote:gfm[])
36+
file. If you need additional files you should place them *only* in the
37+
directory. It's important, i.e. required, to properly fill in the `authors`
38+
and `email` metadata fields at the top with your information. As they are
39+
used for proper license attribution. Consult the
40+
https://docs.asciidoctor.org/asciidoc/latest/[Asciidoctor documentation],
41+
or on how to do that.
42+
43+
. Submit a pull request. In addition to the RFC itself you should provide a
44+
brief description in the pull request itself. Copy-pasting the RFC abstract
45+
into the PR description is minimally sufficient.
46+
47+
. Use the pull request number you now have to rename the
48+
`src/00/00-my-proposal` directory to match the PR number and fill the
49+
`rfcpr` field in `proposal.adoc` (or `proposal.md` for Markdown
50+
footnote:gfm[]) to match.
51+
52+
. At this time the RFC will be considered _active_ and will be labeled
53+
accordingly. The RFC will receive initial feedback for which you will need to
54+
respond, preferably both in the PR comments and reflected in the RFC text
55+
itself.
56+
57+
. After some time, and sufficient discussion and interest, and if this is a
58+
proposal for a standard change (or addition) you will need to write wording for
59+
the standard and create a PR in the
60+
https://github.com/ecostd/standard[standard] repository. You may also be
61+
directly asked to produce a wording PR if needed. When you have such a PR
62+
edit the RFC `stdpr` field. The RFC will be labeled either as needing
63+
wording and/or having wording as appropriate. The wording PR will be
64+
discussed in that PR and/or the RFC. The discussion may incur doing changes
65+
to the RFC.
66+
67+
. After sufficient time and discussion the combined RFC and wording PR will
68+
be considered ready for a decision on further progress. A member of the
69+
"adoption review group" will propose taking a vote for adoption.
70+
71+
. An adoption vote starts after three members of the review group agree. The
72+
vote will last at most 28 calendar days, and at least 7 calendar days. The
73+
length of the voting period will be part of the voting proposal. But the
74+
length is subject to community feedback before and during the voting. The
75+
RFC PR will be labeled accordingly to reflect the voting.
76+
77+
. When the adoption vote completes the RFC is either approved or rejected. The
78+
RFC will be labeled accordingly and may be closed.
79+
80+
. A rejected RFC PR may be closed depending on the reasons for rejection. The
81+
RFC may stay active, but go back to being discussed, if there are changes
82+
possible and reconsidered for approval.
83+
84+
. An approved RFC PR is closed, and labeled as adopted. The actions proscribed
85+
in the RFC are then taken up by others to complete. For RFCs that affect the
86+
https://github.com/ecostd/standard[standard] will continue in the related
87+
PR by the "standard editors group".
88+
89+
TIP: The preferred document format for RFCs is
90+
https://asciidoctor.org[Asciidoctor]. But the
91+
https://github.github.com/gfm/[GitHub Flavored Markdown] format is supported as
92+
an alternative. The extent of support is subject to what is supported by the
93+
conversion to Asciidoctor process as part of build the HTML for the
94+
https://ecostd.github.io/rfcs/[RFCs website].
95+
96+
[#guidelines]
97+
== Guidelines
98+
99+
These are a loose collection of rules to follow, things to keep in mind, and
100+
background information that is useful when creating RFCs. They are grouped by
101+
the aspect of RFCs that they apply to:
102+
103+
<<guidelines-mechanics>>:: Guidelines for the task of the RFC and PR itself.
104+
<<guidelines-design>>:: Guidelines for that help with the design content of an RFC.
105+
106+
These are _guidelines_, and not _rules_. They are expected to be true most
107+
times. But we allow for flexibility in the process. The goal is to reduce
108+
friction as much as possible without sacrificing comprehensive evaluation of
109+
RFCs.
110+
111+
[#guidelines-mechanics]
112+
=== Mechanics
113+
114+
Do not squash, or otherwise coalesce, changes for RFC PRs::
115+
After creating an RFC PR additional updates should be done as additional, plain,
116+
commits. Having the additional commits helps in tracking how feedback is
117+
addressed. When an RFC is approved it will be squash merged. Hence attempts to
118+
pre-squash would be wasted.
119+
120+
Mirror external feedback in the PR::
121+
Any feedback you get outside of PR comments should be summarized, by you, as
122+
comments in the PR. And if there are changes, i.e. additional commits, to the
123+
RFC that are related they should be mentioned in the PR comments.
124+
125+
Do not change approved PRs::
126+
After a PR is approved, and labeled as such, do not alter it. It will be merged
127+
in due time. If there are followup changes they should come as different RFCs.
128+
129+
[#guidelines-design]
130+
=== Design
131+
132+
Prefer solutions that cast a wide net::
133+
The key goal of EcoStd is to facilitate wide adoption and interoperation. Hence
134+
single solutions that solve a wide scope are preferred. Which means that you can
135+
expect questions like: "`Does this solve X, Y, and Z also?`", "`Have you
136+
considered use case U?`", and more.
137+
138+
Including existing practice is essential for an RFC::
139+
Engineering is an iterative practice as such it makes progress from existing
140+
solutions towards better ones. Solutions without a problem are just dreams that
141+
are not likely widely shared. For those reasons, and more, it's imperative that
142+
an RFC is based on existing practice, i.e. demonstrate that there's a problem
143+
and solution that this is trying to improve.
144+
145+
Seek consensus with proposals and when responding to feedback::
146+
Because of the goal of this collective work is to achieve as widespread adoption
147+
as possible it's important to consider the varied viewpoints when composing
148+
solutions to problems. You should seek consensus as much as possible at all
149+
times. There are many ways to achieve consensus, and it would be impossible to
150+
enumerate them. But some general ones are:
151+
* Provide rationale (pros and cons) for decisions and feedback.
152+
* Seek to increase factual data in your proposal.
153+
* Include real world examples and use cases.
154+
* Provide before and after comparisons if you are proposing behavior changes.
155+
156+
// TODO: Fill with "Design" section from 0001-rfc-process proposal above.
157+
158+
[[license]]
159+
== License
160+
161+
This repository, and all contributions to it, are licensed under
162+
https://creativecommons.org/licenses/by/4.0/[CC BY 4.0].
163+
164+
ifeval::["{publish}" == "html"]
165+
166+
[[rfcs]]
167+
== Adopted RFCs
168+
169+
include::.build/rfcindex.adoc[]
170+
171+
endif::[]
172+
173+
include::CONTRIBUTORS.adoc[leveloffset=+1]

project-root.jam

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
#|
2+
Copyright René Ferdinand Rivera Morell
3+
|#
4+
5+
require-b2 5.3 ;
6+
7+
import asciidoctor ;
8+
import regex ;
9+
import set ;
10+
import "class" : new ;
11+
import toolset ;
12+
import path ;
13+
14+
path-constant here : . ;
15+
16+
project /ecostd.rfcs
17+
: build-dir .build
18+
;
19+
20+
# Find all the RFC proposals and define targets to build html for them.
21+
local rfcs ;
22+
local rfc-proposals ;
23+
for local proposal in [ glob src/*/*/proposal.* ]
24+
{
25+
local rfc = [ MATCH "^src/([0-9][0-9])/([0-9][0-9])-([^/]+)" : $(proposal) ] ;
26+
local type = $(proposal:S) ;
27+
if $(rfc[3])
28+
{
29+
rfc = $(rfc[1])$(rfc[2])-$(rfc[3]) ;
30+
if .adoc = $(type)
31+
{
32+
rfcs += $(rfc) ;
33+
rfc-proposals += $(proposal) ;
34+
# ADOC => HTML target.
35+
explicit [ html $(rfc).html : $(proposal) ] ;
36+
# Utility target to locally build proposal html (in proposal dir).
37+
explicit [ install $(rfc) : $(rfc).html : <location>$(proposal:D) ] ;
38+
}
39+
else if .md = $(type)
40+
{
41+
rfcs += $(rfc) ;
42+
rfc-proposals += $(proposal) ;
43+
# MD => ADOC target.
44+
explicit [ make $(rfc).adoc : $(proposal) : @md_to_adoc
45+
: <dependency>project-root.jam
46+
<flags>"--attribute=license=Creative Commons Attribution 4.0 International License (CC BY 4.0)"
47+
<flags>"--attribute=copyright=Copyright {authors}"
48+
<flags>--attribute=version-label!
49+
<flags>--attribute=reproducible
50+
<flags>--attribute=nofooter
51+
<flags>--attribute=sectanchors
52+
<flags>--attribute=sectnums
53+
<flags>--attribute=sectnumlevels=10
54+
<flags>--attribute=source-highlighter=rouge
55+
<flags>--attribute=toc
56+
<flags>--attribute=toc-title=Contents
57+
<flags>--attribute=toclevels=5
58+
<flags>"--attribute=revdate={docdate}"
59+
] ;
60+
# ADOC => HTML target.
61+
explicit [ html $(rfc).html : $(rfc).adoc ] ;
62+
# Utility target to locally build proposal html (in proposal dir).
63+
explicit [ install $(rfc) : $(rfc).html : <location>$(proposal:D) ] ;
64+
}
65+
else
66+
{
67+
ECHO "WARNING: The RFC at $(proposal) is an unsupported document type." ;
68+
}
69+
}
70+
else
71+
{
72+
ECHO "WARNING: The RFC at $(proposal) is missing a name." ;
73+
}
74+
}
75+
76+
# Scan RFC proposal.adoc files for information to generate various files.
77+
RFCINDEX_ADOC = ;
78+
local rfc-authors = [ new set ] ;
79+
local rfc-info =
80+
[ regex.grep $(here)/src : proposal.adoc proposal.md
81+
: "= ([^\n]+).:" "---[\n]+# ([^\n]+)" "authors: ([^\n]+)" : 1
82+
: recursive ]
83+
;
84+
while $(rfc-info)
85+
{
86+
local prop = $(rfc-info[1]) ;
87+
local title = $(rfc-info[2]) ;
88+
local authors = [ SORT [ regex.split $(rfc-info[4]) ",[ ]?" ] ] ;
89+
$(rfc-authors).add $(authors) ;
90+
rfc-info = $(rfc-info[5-]) ;
91+
local rfc = [ MATCH "src/([0-9][0-9])/([0-9][0-9])-([^/]+)" : $(prop) ] ;
92+
rfc = $(rfc[1])$(rfc[2])-$(rfc[3]) ;
93+
RFCINDEX_ADOC +=
94+
"| link:$(rfc).html[$(rfc)] | $(title) | $(authors:J=, )"
95+
;
96+
}
97+
98+
# Generate asciidoctor RFC from markdown/GFM RFC.
99+
toolset.flags $(__name__).md_to_adoc FLAGS : <flags> : unchecked ;
100+
KRAMDOC = [ path.native [ path.join [ path.make
101+
[ SHELL "gem environment user_gemdir" : strip-eol ] ] "bin" "kramdoc" ] ] ;
102+
actions md_to_adoc
103+
{
104+
"$(KRAMDOC)" "$(>)" "--output=$(<)" --auto-ids --auto-id-prefix= "$(FLAGS)"
105+
}
106+
107+
# Generate rfcindex.adoc from RFC scan. Used in html RFC site docs.
108+
RFCINDEX_ADOC =
109+
"[cols=\"3*\",stripes=odd]"
110+
"|==="
111+
"| RFC | Title | Authors"
112+
""
113+
[ SORT $(RFCINDEX_ADOC) ]
114+
"|==="
115+
;
116+
RFCINDEX_ADOC = "$(RFCINDEX_ADOC:J=
117+
)" ;
118+
119+
make rfcindex.adoc : : @make_rfcindex_adoc
120+
: <dependency>project-root.jam
121+
<dependency>$(rfcs).html
122+
;
123+
explicit rfcindex.adoc ;
124+
actions make_rfcindex_adoc
125+
{
126+
echo @($(<):O=F:E=$(RFCINDEX_ADOC))
127+
}
128+
129+
# Generate CONTRIBUTORS.adoc automatically from RFC authors.
130+
CONTRIBUTORS_ADOC =
131+
"= Contributors"
132+
""
133+
;
134+
CONTRIBUTORS_ADOC +=
135+
"== RFC Authors"
136+
""
137+
;
138+
for local author in [ SORT [ $(rfc-authors).list ] ]
139+
{
140+
CONTRIBUTORS_ADOC += "* $(author)" ;
141+
}
142+
CONTRIBUTORS_ADOC = "$(CONTRIBUTORS_ADOC:J=
143+
)" ;
144+
make CONTRIBUTORS.adoc : : @make_contributors_adoc
145+
: <dependency>project-root.jam
146+
<dependency>$(rfc-proposals)
147+
;
148+
explicit CONTRIBUTORS.adoc ;
149+
actions make_contributors_adoc
150+
{
151+
echo @($(<):O=F:E=$(CONTRIBUTORS_ADOC))
152+
}
153+
154+
# Generate the index.html for GH pages site of RFC database.
155+
html index.html : README.adoc
156+
: <dependency>rfcindex.adoc
157+
<dependency>CONTRIBUTORS.adoc
158+
<asciidoctor-attribute>publish=html
159+
;
160+
explicit index.html ;
161+
162+
# Place the GH pages files in the place we publish from (in CI).
163+
install pub
164+
: $(rfcs).html
165+
index.html
166+
: <location>.build/pub
167+
;
168+
explicit pub ;
169+
170+
# Update general information files that we commit for direct visibility in GH.
171+
install info
172+
: CONTRIBUTORS.adoc
173+
: <location>.
174+
;
175+
explicit info ;

0 commit comments

Comments
 (0)