blob: 964198bbabcb0b0fbd4a659c6da8f154c64647f9 [file] [log] [blame] [view]
<!-- mdformat off(templates not supported) -->
{% set rfcid = "RFC-0098" %}
{% include "docs/contribute/governance/rfcs/_common/_rfc_header.md" %}
# {{ rfc.name }}: {{ rfc.title }}
<!-- SET the `rfcid` VAR ABOVE. DO NOT EDIT ANYTHING ELSE ABOVE THIS LINE. -->
<!-- mdformat on -->
## Motivation
The [Component Framework][cf-intro] (CF) system provides the foundations for
running software on Fuchsia. With the exception of a few early-boot processes,
all software spanning from low-level system services to UI-driven front end
apps, are [components][glossary.component] and operate in the context of the
Component Runtime.
For this reason, changes to the Component Framework can have a broad impact on
the Fuchsia architecture and on developers who write software targeting
Fuchsia.
The [Fuchsia-wide RFC process][rfc-process] provides a consistent and
transparent process for making technical decisions with broad impact. This
document seeks to provide the detail necessary to disambiguate between which CF
changes have sufficiently broad impact to deserve a dedicated RFC, and which do
not.
## Design
### Changes that require an RFC
* **Changes resulting in additions or modifications to the public CF APIs,
libraries, and tools,** as exposed in the Fuchsia SDK. For example, changes to
`fuchsia.sys2`, `fuchsia.component`, `fuchsia.session`, CML, C++ component
libraries, and so on.
* **Changes to security policy, including allowlists and capability routing**.
For example, adding a new allowlisting security policy, or adding a new
routable capability.
* **Changes to Component Manager that would result in externally visible
effects**. For example, a change in how shutdown order is calculated, or
any substantial change to its performance profile (code size, memory use, cpu
time).
* **Changes to Session Manager that would result in externally visible
effects**. For example, changes to the set of capabilities routed from the
platform to sessions, and vice versa, or any substantial change to its
performance profile.
* **Changes that introduce or remove platform components used in sessions**, as
part of the SDK. For example: introducing a new "manager" component that is
intended to be reused across sessions.
* **New debugging or diagnostics features for Component Manager**. For example,
a new logs analysis feature, or additions to Inspect.
* **Changes that propose modifications to the component architecture**. For
example, introducing new resource management and quota concepts.
* **Major changes or additions to .CML file syntax**. For example, changing the
structure of how .CML files express routing to children.
When a change does not fit the above criteria perfectly, the default stance is
to either:
1) Follow the RFC process, or
1) Seek input from the Fuchsia Engineering Council
RFCs that document the status-quo are optional but encouraged. Publishing a
status-quo RFC expands awareness of the existing architecture of Fuchsia to
many more individuals, including those individuals outside Google.
Additionally, they provide references to the current state of the architecture
for future RFC authors to link to.
### Positive examples: past changes that would now require an RFC
Note: Prior to adopting the RFC process, the Component Framework team used a
local design review processed called Component Tuning Proposals (CTP).
* Component resolvers (CTP-013): introduced a CF extension point allowing
component authors to alter how component URLs are resolved into component
metadata and executable content.
* Components v2 allow-lists (CTP-020): introduced a mechanism to control the
security policy of the CF runtime
* Route runners through environments (CTP-021): proposed a change to how runner
capabilities were routed to children and grandchildren within a component
topology
* Realm Builder (nee Topology Builder - CTP-033), _when introduced to the SDK_:
a library for tests to create complex component topologies at runtime.
* New CML capability syntax (CTP-023): changed the syntax of capability routing
in .CML files
* Stdio as a capability (CTP-031, RFC-69): Introduced new routable capabilities
for stdout, stdin, and stderr, and defined the .CML file syntax for said
routing.
* Use from child (CTP-036): although a small change, it impacts constraints
previously placed on routing between components.
### Negative examples: past changes that still would not require an RFC
* Component Framework API revisions (CTP-030): API revisions for better
readability, and clearer semantics, without altering the behavior of the
component runtime itself.
* Component Manager configurability (CTP-024): proposed a new mechanism to
configure the internal behavior of component_manager to remove tech debt
introduced through a less advanced configuration mechanism.
* Component Graph Analysis (CTP-034): introduced build-time static analysis on
component manifests in fuchsia.git in order to catch mismatches in routing
due to human error.
### Progressing from idea to RFC
Many features require work along spectrum from prototyping, to design feedback
from peers, to getting hands-on customer experience with production-quality
code and APIs. It is not unusual for CF contributors to gain experience with
features, with iteratively-expanding audiences. For example, a feature proposal
may go through a less-formal design process including members of the core team,
an implementation, and then experimentation with `fuchsia.git` developers,
before going through the more
formal RFC process.
Contributors may opt to enter the RFC process earlier, at their discretion,
especially when they can predict that their design is destined for an RFC based
on the criteria described above.
## Implementation strategy
Any work that has already gone through the CF project's established design
review processes will not be retroactively required to adhere to the RFC
criteria defined here.
If a contributor wishes to work with the CF team on an RFC, they should feel
free to reach out to <component-framework-dev@fuchsia.dev> and we'll assign
them a designated contact.
## Performance
No impact, process-only change.
## Ergonomics
We'll revisit these criteria if we find that the criteria herein are allowing
changes to move ahead that would have been served better by the RFC process, or
if the criteria herein are found to be too restrictive.
## Backwards Compatibility
No impact.
## Security Considerations
Changes to the Component Framework area that modify security policy or
strategy will require an RFC.
## Privacy considerations
Changes to the Component Framework area that modify privacy policy or
strategy will require an RFC.
## Testing
No impact.
## Documentation
Does not apply.
## Drawbacks, alternatives, and unknowns
It is unknown if the criteria in this document strike the right balance between
broad, inclusive review at the expense of velocity, versus more targeted review.
Another alternative is to stick with the status-quo: the CF team uses its
internal CTP process.
## Prior art and references
* [Zircon RFC criteria][zircon-criteria]
* [FIDL RFC criteria and process][fidl-criteria]
[cf-intro]: /docs/concepts/components/v2/introduction.md
[glossary.component]: /docs/glossary/README.md#component
[rfc-process]: /docs/contribute/governance/rfcs/0001_rfc_process.md
[fidl-criteria]: 0049_fidl_tuning_process_evolution.md#criteria
[zircon-criteria]: 0006_addendum_to_rfc_process_for_zircon.md