| # FIDL design history |
| |
| This page provides a starting point for navigating [RFCs] in the "FIDL" area. It |
| organizes them in various ways and gives an updated status on each, bringing the |
| reader up to speed with FIDL's history and current direction. |
| |
| Previously, these design documents were called [FTPs] or FIDL Tuning Proposals. |
| The FTP process was later [merged into][rfc-0017] the RFC process. Because of |
| the way FTPs were renumbered as RFCs, RFC numbers do not imply chronology. |
| However, each individual list on this page shows RFCs in chronological order. |
| |
| ## By theme |
| |
| This section organizes FIDL RFCs by theme. Each RFC is listed once, under its |
| primary theme, even if it touches on multiple themes. |
| |
| ### Governance |
| |
| * [RFC-0018: FTP process: A modest proposal][rfc-0018] |
| * [RFC-0049: FIDL tuning process evolution][rfc-0049] |
| * [RFC-0017: The FTP Process is dead, long live the RFC Process!][rfc-0017] |
| |
| ### Evolvability |
| |
| * [RFC-0047: Tables][rfc-0047] |
| * (Rejected) [RFC-0063: OrdinalRange][rfc-0063] |
| * [RFC-0058: Introduce a deprecated attribute][rfc-0058] |
| * [RFC-0061: Extensible unions][rfc-0061] |
| * [RFC-0020: Interface ordinal hashing][rfc-0020] |
| * [RFC-0021: Soft transitions for methods add and remove][rfc-0021] |
| * [RFC-0024: Mandatory source compatibility][rfc-0024] |
| * [RFC-0029: Increasing method ordinals][rfc-0029] |
| * [RFC-0033: Handling of unknown fields and strictness][rfc-0033] |
| * [RFC-0037: Transactional message header v3][rfc-0037] |
| * [RFC-0040: Identifier uniqueness][rfc-0040] |
| * [RFC-0048: Explicit union ordinals][rfc-0048] |
| * [RFC-0083: FIDL versioning][rfc-0083] |
| |
| ### Expressivity |
| |
| * [RFC-0019: Type aliases with using][rfc-0019] |
| * [RFC-0022: Default values for struct members][rfc-0022] |
| * [RFC-0066: Programmer advisory explicit defaults][rfc-0066] |
| * (Rejected) [RFC-0065: No optional strings or vectors][rfc-0065] |
| * (Rejected) [RFC-0064: Box\<Knox\>][rfc-0064] |
| * [RFC-0023: Compositional model for protocols][rfc-0023] |
| * [RFC-0041: Support for unifying services and devices][rfc-0041] |
| * (Rejected) [RFC-0044: Extensible method arguments][rfc-0044] |
| * [RFC-0052: Type aliasing and new types][rfc-0052] |
| * [RFC-0054: Parameter attributes][rfc-0054] |
| |
| ### Syntax |
| |
| * (Rejected) [RFC-0038: Separating layout from constraints][rfc-0038] |
| * (Rejected) [RFC-0039: Types come second][rfc-0039] |
| * [RFC-0050: Syntax revamp][rfc-0050] |
| * [RFC-0086: Updates to RFC-0050: FIDL attributes syntax][rfc-0086] |
| * [RFC-0087: Updates to RFC-0050: FIDL method parameter syntax][rfc-0087] |
| |
| ### Ergonomics |
| |
| * [RFC-0053: Epitaphs][rfc-0053] |
| * [RFC-0056: Empty structs][rfc-0056] |
| * [RFC-0060: Error handling][rfc-0060] |
| * [RFC-0025: Bit flags][rfc-0025] |
| * (Rejected) [RFC-0031: Typed epitaphs][rfc-0031] |
| * [RFC-0057: Default no handles][rfc-0057] |
| |
| ### Performance |
| |
| * (Rejected) [RFC-0026: Envelopes everywhere][rfc-0026] |
| * [RFC-0027: You only pay for what you use][rfc-0027] |
| * (Rejected) [RFC-0032: Efficient envelopes][rfc-0032] |
| * (Rejected) [RFC-0035: Automatic flow tracing][rfc-0035] |
| * (Rejected) [RFC-0045: Zero-size empty structs][rfc-0045] |
| |
| ### Safety & security |
| |
| * [RFC-0051: Safer structs for C++][rfc-0051] |
| * (Rejected) [RFC-0062: Method impossible][rfc-0062] |
| * [RFC-0028: Handle rights][rfc-0028] |
| * (Rejected) [RFC-0034: Null terminate strings][rfc-0034] |
| |
| ### Tooling |
| |
| * [RFC-0076: FIDL API summaries][rfc-0076] |
| |
| ### Documentation |
| |
| * [RFC-0055: Documentation comments][rfc-0055] |
| * [RFC-0043: Documentation comment format][rfc-0043] |
| |
| ### Simplify design space |
| |
| * [RFC-0030: FIDL is little endian][rfc-0030] |
| * [RFC-0059: Reserved bits in vector, string, and array count fields][rfc-0059] |
| |
| ## By language feature |
| |
| This section lists RFCs that introduced new feature that are easily visible in |
| the FIDL language. It only includes current features, not obsolete ones. |
| |
| | Feature | RFC | Note |
| | -------------------- | -----------| ------------------------------------------ |
| | struct defaults | [RFC-0022] | Default values for struct members |
| | `table` | [RFC-0047] | Forward and backward compatible data type |
| | `///` | [RFC-0055] | Documentation comments |
| | `struct Empty {};` | [RFC-0056] | Empty structs |
| | `error` | [RFC-0060] | Method error result syntax |
| | `union` | [RFC-0061] | Initially called `xunion`, replaced the old static unions |
| | `[Selector]` | [RFC-0020] | Override method hashing with an explicit selector |
| | `[Transitional]` | [RFC-0021] | Attribute for soft transitioning method addition/removal |
| | `compose` | [RFC-0023] | Renamed `interface` to `protocol`, added the `compose` feature |
| | `bits` | [RFC-0025] | Bit flags types |
| | handle rights | [RFC-0028] | Annotate required or excluded handle rights |
| | `strict`, `flexible` | [RFC-0033] | Strict and flexible types |
| | `service` | [RFC-0041] | Services are collection of protocols |
| | `alias`, `type` | [RFC-0052] | Replaced `using` aliases with `alias` and `type` |
| | `resource` | [RFC-0057] | Value and resource types |
| |
| <!-- TODO(fxbug.dev/67858): Uncomment when implemented. --> |
| <!-- | `@available` | [RFC-0083] | Version annotations --> |
| |
| ## Current status |
| |
| This section gives the current status of all FIDL RFCs. |
| |
| _Legend:_ |
| |
| | Status | Meaning |
| | -------------------------- | ------------------------------------------------------ |
| | Unpublished | Never made public nor formally reviewed |
| | Withdrawn | Made public, but never formally reviewed |
| | Implemented | Accepted, implemented, still accurate |
| | Unimplemented | Accepted but never implemented, no plans to do so |
| | Partially implemented | Accepted and partially implemented, no plans to finish |
| | Implementation in progress | Accepted, implementation in progress |
| | Amended | Accepted, still mostly accurate, but amended by a later RFC |
| | Superseded | Accepted but no longer accurate, superseded by a later RFC |
| | Rejected | Formally rejected |
| | Rejected; Superseded | Formally rejected, then superseded by a later RFC |
| |
| | RFC | Title | Status |
| | ---------- | ------------------------------ | -------------------------------- |
| | [RFC-0018] | FTP process: A modest proposal | Superseded by [RFC-0017] |
| | [RFC-0019] | Type aliases with using | Superseded by [RFC-0052] |
| | [RFC-0022] | Default values for struct members | Partially implemented: only in HLCPP, Dart |
| | [RFC-0051] | Safer structs for C++ | Unimplemented: [change][safer-structs-impl] was never merged |
| | [RFC-0062] | Method impossible | Rejected |
| | [RFC-0066] | Programmer advisory explicit defaults | Implemented |
| | [RFC-0047] | Tables | Implemented |
| | [RFC-0053] | Epitaphs | Implemented |
| | [RFC-0055] | Documentation comments | Amended by [RFC-0043] |
| | [RFC-0063] | OrdinalRange | Rejected; Superseded by [RFC-0020] |
| | – | FIDL in FIDL | Unpublished; Protobuf [can do this][protobuf-self-describe] |
| | [RFC-0056] | Empty structs | Implemented |
| | [RFC-0058] | Introduce a deprecated attribute | Superseded by [RFC-0083] |
| | [RFC-0060] | Error handling | Implemented |
| | [RFC-0061] | Extensible unions | Implemented |
| | [RFC-0065] | No optional strings or vectors | Rejected |
| | [RFC-0064] | Box\<Knox\> | Rejected; see also "FIDL large message support" |
| | – | Sequences | Unpublished; earlier version of "Streams" |
| | – | Streams | Unpublished; see also [measure-tape] (a pragmatic solution) |
| | [RFC-0020] | Interface ordinal hashing | Implemented |
| | [RFC-0021] | Soft transitions for methods add and remove | Implemented |
| | [RFC-0023] | Compositional model for protocols | Implemented |
| | [RFC-0024] | Mandatory source compatibility | Implemented; see also [source_compatibility] |
| | [RFC-0025] | Bit flags | Implemented |
| | [RFC-0026] | Envelopes everywhere | Rejected |
| | [RFC-0027] | You only pay for what you use | Implemented |
| | [RFC-0028] | Handle rights | Implementation in progress |
| | [RFC-0029] | Increasing method ordinals | Superseded by [RFC-0037] |
| | [RFC-0030] | FIDL is little endian | Implemented |
| | [RFC-0031] | Typed epitaphs | Rejected |
| | [RFC-0032] | Efficient envelopes | Rejected (accepted at first, later rejected) |
| | [RFC-0033] | Handling of unknown fields and strictness | Implemented |
| | [RFC-0034] | Null terminate strings | Rejected |
| | [RFC-0035] | Automatic flow tracing | Rejected |
| | [RFC-0036] | Update to struct declarations | Rejected |
| | [RFC-0037] | Transactional message header v3 | Implemented |
| | [RFC-0038] | Separating layout from constraints | Rejected; Superseded by [RFC-0050] |
| | [RFC-0039] | Types come second | Rejected; Superseded by [RFC-0050] |
| | [RFC-0040] | Identifier uniqueness | Implemented (rejected at first, later accepted) |
| | [RFC-0041] | Support for unifying services and devices | Implemented |
| | [RFC-0042] | Non nullable types | Rejected (April Fools) |
| | [RFC-0043] | Documentation comment format | Implemented |
| | [RFC-0044] | Extensible method arguments | Rejected; Superseded by [RFC-0087] |
| | [RFC-0045] | Zero-size empty structs | Rejected |
| | – | Versioning | Unpublished; Superseded by [RFC-0083] |
| | – | Required table fields | Unpublished |
| | [RFC-0048] | Explicit union ordinals | Implemented |
| | [RFC-0049] | FIDL tuning process evolution | Implemented |
| | [RFC-0050] | Syntax revamp | Implementation in progress |
| | – | Unified view of optionality | Unpublished |
| | [RFC-0052] | Type aliasing and new types | Implementation in progress |
| | – | Iterators | Unpublished; see also [measure-tape] (a pragmatic solution) |
| | [RFC-0054] | Parameter attributes | Implemented |
| | – | Restrict non-numeric floating point values | Unpublished |
| | – | Constant expressions | Unpublished |
| | [RFC-0057] | Default no handles | Implemented |
| | – | FIDL text format | Unpublished |
| | [RFC-0059] | Reserved bits in vector, string, and array count fields | Implemented; reserved bits no longer used by LLCPP |
| | – | FIDL Large message support | [Withdrawn][large-message-cl] |
| | [RFC-0076] | FIDL API summaries | Implementation in progress |
| | [RFC-0083] | FIDL versioning | Implementation in progress |
| | [RFC-0086] | Updates to RFC-0050: FIDL attributes syntax | Implementation in progress |
| | [RFC-0087] | Updates to RFC-0050: FIDL method parameter syntax | Implementation in progress |
| |
| <!-- link labels --> |
| [rfcs]: /docs/contribute/governance/rfcs/README.md#proposals |
| [ftps]: /docs/contribute/governance/deprecated-ftp-process.md |
| [safer-structs-impl]: https://fuchsia-review.googlesource.com/c/garnet/+/139083 |
| [protobuf-self-describe]: https://developers.google.com/protocol-buffers/docs/techniques#self-description |
| [measure-tape]: /tools/fidl/measure-tape/README.md |
| [source_compatibility]: /src/tests/fidl/source_compatibility/README.md |
| [large-message-cl]: https://fuchsia-review.googlesource.com/c/fuchsia/+/470640 |
| [rfc-0017]: /docs/contribute/governance/rfcs/0017_folding_ftp_into_rfc.md |
| [rfc-0018]: /docs/contribute/governance/rfcs/0018_ftp_process.md |
| [rfc-0019]: /docs/contribute/governance/rfcs/0019_using_evolution_uint64.md |
| [rfc-0020]: /docs/contribute/governance/rfcs/0020_interface_ordinal_hashing.md |
| [rfc-0021]: /docs/contribute/governance/rfcs/0021_soft_transitions_methods_add_remove.md |
| [rfc-0022]: /docs/contribute/governance/rfcs/0022_default_values_for_struct.md |
| [rfc-0023]: /docs/contribute/governance/rfcs/0023_compositional_model_protocols.md |
| [rfc-0024]: /docs/contribute/governance/rfcs/0024_mandatory_source_compatibility.md |
| [rfc-0025]: /docs/contribute/governance/rfcs/0025_bit_flags.md |
| [rfc-0026]: /docs/contribute/governance/rfcs/0026_envelopes_everywhere.md |
| [rfc-0027]: /docs/contribute/governance/rfcs/0027_you_only_pay_what_you_use.md |
| [rfc-0028]: /docs/contribute/governance/rfcs/0028_handle_rights.md |
| [rfc-0029]: /docs/contribute/governance/rfcs/0029_increasing_method_ordinals.md |
| [rfc-0030]: /docs/contribute/governance/rfcs/0030_fidl_is_little_endian.md |
| [rfc-0031]: /docs/contribute/governance/rfcs/0031_typed_epitaphs.md |
| [rfc-0032]: /docs/contribute/governance/rfcs/0032_efficient_envelopes.md |
| [rfc-0033]: /docs/contribute/governance/rfcs/0033_handling_unknown_fields_strictness.md |
| [rfc-0034]: /docs/contribute/governance/rfcs/0034_null_terminate_strings.md |
| [rfc-0035]: /docs/contribute/governance/rfcs/0035_automatic_flow_tracing.md |
| [rfc-0036]: /docs/contribute/governance/rfcs/0036_update_struct_declarations.md |
| [rfc-0037]: /docs/contribute/governance/rfcs/0037_transactional_message_header_v3.md |
| [rfc-0038]: /docs/contribute/governance/rfcs/0038_seperating_layout_from_constraints.md |
| [rfc-0039]: /docs/contribute/governance/rfcs/0039_types_come_second.md |
| [rfc-0040]: /docs/contribute/governance/rfcs/0040_identifier_uniqueness.md |
| [rfc-0041]: /docs/contribute/governance/rfcs/0041_unifying_services_devices.md |
| [rfc-0042]: /docs/contribute/governance/rfcs/0042_non_nullable_types.md |
| [rfc-0043]: /docs/contribute/governance/rfcs/0043_documentation_comment_format.md |
| [rfc-0044]: /docs/contribute/governance/rfcs/0044_extensible_method_arguments.md |
| [rfc-0045]: /docs/contribute/governance/rfcs/0045_zero_size_empty_structs.md |
| [rfc-0047]: /docs/contribute/governance/rfcs/0047_tables.md |
| [rfc-0048]: /docs/contribute/governance/rfcs/0048_explicit_union_ordinals.md |
| [rfc-0049]: /docs/contribute/governance/rfcs/0049_fidl_tuning_process_evolution.md |
| [rfc-0050]: /docs/contribute/governance/rfcs/0050_syntax_revamp.md |
| [rfc-0051]: /docs/contribute/governance/rfcs/0051_safer_structs_for_cpp.md |
| [rfc-0052]: /docs/contribute/governance/rfcs/0052_type_aliasing_named_types.md |
| [rfc-0053]: /docs/contribute/governance/rfcs/0053_epitaphs.md |
| [rfc-0054]: /docs/contribute/governance/rfcs/0054_parameter_attributes.md |
| [rfc-0055]: /docs/contribute/governance/rfcs/0055_documentation_comments.md |
| [rfc-0056]: /docs/contribute/governance/rfcs/0056_empty_structs.md |
| [rfc-0057]: /docs/contribute/governance/rfcs/0057_default_no_handles.md |
| [rfc-0058]: /docs/contribute/governance/rfcs/0058_deprecated_attribute.md |
| [rfc-0059]: /docs/contribute/governance/rfcs/0059_reserved_bits_count_fields.md |
| [rfc-0060]: /docs/contribute/governance/rfcs/0060_error_handling.md |
| [rfc-0061]: /docs/contribute/governance/rfcs/0061_extensible_unions.md |
| [rfc-0062]: /docs/contribute/governance/rfcs/0062_method_impossible.md |
| [rfc-0063]: /docs/contribute/governance/rfcs/0063_OrdinalRange.md |
| [rfc-0064]: /docs/contribute/governance/rfcs/0064_box_knox.md |
| [rfc-0065]: /docs/contribute/governance/rfcs/0065_optional_strings_or_vectors.md |
| [rfc-0066]: /docs/contribute/governance/rfcs/0066_programmer_advisory_explicit.md |
| [rfc-0076]: /docs/contribute/governance/rfcs/0076_fidl_api_summaries.md |
| [rfc-0083]: /docs/contribute/governance/rfcs/0083_fidl_versioning.md |
| [rfc-0086]: /docs/contribute/governance/rfcs/0086_rfc_0050_attributes.md |
| [rfc-0087]: /docs/contribute/governance/rfcs/0087_fidl_method_syntax.md |