| # 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 submission date for FTP-turned-RFCs, and by review date for all later RFCs. |
| |
| ## 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] |
| * [RFC-0131: Design principles of the FIDL wire format][rfc-0131] |
| |
| ### 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-0033: Handling of unknown fields and strictness][rfc-0033] |
| * [RFC-0029: Increasing method ordinals][rfc-0029] |
| * [RFC-0037: Transactional message header v3][rfc-0037] |
| * [RFC-0024: Mandatory source compatibility][rfc-0024] |
| * [RFC-0040: Identifier uniqueness][rfc-0040] |
| * [RFC-0048: Explicit union ordinals][rfc-0048] |
| * [RFC-0083: FIDL versioning][rfc-0083] |
| * (Rejected) [RFC-0116: Wire format support for sparser FIDL tables][rfc-0116] |
| * [RFC-0132: FIDL table size limit][rfc-0132] |
| * [RFC-0138: Handling unknown interactions][rfc-0138] |
| |
| ### 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] |
| * (Rejected) [RFC-0042: Non nullable types][rfc-0042] |
| * [RFC-0041: Support for unifying services and devices][rfc-0041] |
| * (Rejected) [RFC-0044: Extensible method arguments][rfc-0044] |
| * [RFC-0054: Parameter attributes][rfc-0054] |
| * [RFC-0052: Type aliasing and new types][rfc-0052] |
| * [RFC-0137: Discard unknown data in FIDL][rfc-0137] |
| * [RFC-0160: Remove support for FIDL struct defaults][rfc-0160] |
| |
| ### Syntax |
| |
| * (Rejected) [RFC-0036: Update to struct declarations][rfc-0036] |
| * (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] |
| * (Rejected) [RFC-0088: Updates to RFC-0050: FIDL bits, enum, and constraints syntax][rfc-0088] |
| * [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] |
| * [RFC-0196: FIDL large messages][rfc-0196] |
| |
| ### Domain |
| |
| * [RFC-0120: Standalone use of the FIDL wire format][rfc-0120] |
| * [RFC-0190: FIDL support for syscalls][rfc-0190] |
| |
| ### Performance |
| |
| * (Rejected) [RFC-0045: Zero-size empty structs][rfc-0045] |
| * (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] |
| * [RFC-0113: Efficient envelopes][rfc-0113] |
| * [RFC-0114: Inlining small values in FIDL envelopes][rfc-0114] |
| * [RFC-0149: FIDL encode validation not mandatory][rfc-0149] |
| |
| ### Safety & security |
| |
| * (Rejected) [RFC-0051: Safer structs for C++][rfc-0051] |
| * (Rejected) [RFC-0062: Method impossible][rfc-0062] |
| * (Rejected) [RFC-0034: Null terminate strings][rfc-0034] |
| * [RFC-0028: Handle rights][rfc-0028] |
| |
| ### Tooling |
| |
| * [RFC-0076: FIDL API summaries][rfc-0076] |
| * [RFC-0097: FIDL Toolchain][rfc-0097] |
| |
| ### 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 |
| | ------------------------ | -----------| ------------------------------------------ |
| | `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 |
| | `strict`, `flexible` | [RFC-0033] | Strict and flexible types |
| | handle rights | [RFC-0028] | Annotate required or excluded handle rights |
| | `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 |
| | anonymous layouts | [RFC-0050] | Inline type definitions, named contextually or with `@generated_name` |
| | `@available` | [RFC-0083] | Version annotations |
| | `Method(table { ... })` | [RFC-0087] | Tables and unions as top-level request/response types |
| | `open`, `closed`, `ajar` | [RFC-0138] | Open and closed interactions |
| |
| <!-- TODO(https://fxbug.dev/42175244): Uncomment when accepted. --> |
| <!-- | `terminal` | [RFC-NNNN] | Terminal events --> |
| |
| ## 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 |
| | In review | Made public, review pending |
| | Implemented | Accepted, implemented, still accurate |
| | 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 |
| |
| | 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 | Superseded by [RFC-0160] |
| | [RFC-0051] | Safer structs for C++ | Rejected |
| | [RFC-0062] | Method impossible | Rejected |
| | [RFC-0053] | Epitaphs | Implemented <!-- TODO(https://fxbug.dev/42175244): Change to "Superseded" when we have terminal events. --> |
| | [RFC-0066] | Programmer advisory explicit defaults | Implemented |
| | [RFC-0047] | Tables | Amended by [RFC-0116], [RFC-0132] |
| | [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-0045] | Zero-size empty structs | Rejected |
| | [RFC-0025] | Bit flags | Implemented |
| | [RFC-0026] | Envelopes everywhere | Rejected |
| | [RFC-0027] | You only pay for what you use | Implemented |
| | [RFC-0030] | FIDL is little endian | Implemented |
| | [RFC-0031] | Typed epitaphs | Rejected |
| | [RFC-0032] | Efficient envelopes | Rejected; Superseded by [RFC-0113] |
| | [RFC-0033] | Handling of unknown fields and strictness | Amended by [RFC-0137] |
| | [RFC-0034] | Null terminate strings | Rejected |
| | [RFC-0029] | Increasing method ordinals | Superseded by [RFC-0037] |
| | [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-0028] | Handle rights | Implemented |
| | [RFC-0042] | Non nullable types | Rejected (April Fools) |
| | [RFC-0024] | Mandatory source compatibility | Implemented |
| | [RFC-0040] | Identifier uniqueness | Implemented (rejected at first, later accepted) |
| | [RFC-0041] | Support for unifying services and devices | [Partially implemented](https://fxbug.dev/42160684#c36): only in C++, Rust |
| | [RFC-0044] | Extensible method arguments | Rejected; Superseded by [RFC-0087] |
| | [RFC-0043] | Documentation comment format | Implemented |
| | – | Versioning | Unpublished; Superseded by [RFC-0083] |
| | – | Required table fields | Unpublished |
| | [RFC-0048] | Explicit union ordinals | Implemented |
| | [RFC-0049] | FIDL tuning process evolution | Superseded by [RFC-0017] |
| | – | Unified view of optionality | Unpublished |
| | – | Iterators | Unpublished; see also [measure-tape] (a pragmatic solution) |
| | [RFC-0054] | Parameter attributes | Superseded by [RFC-0050] |
| | [RFC-0052] | Type aliasing and new types | [Implementation in progress](https://fxbug.dev/42158155) |
| | – | Restrict non-numeric floating point values | Unpublished |
| | – | Constant expressions | Unpublished |
| | [RFC-0057] | Default no handles | Implemented |
| | [RFC-0050] | Syntax revamp | Amended by [RFC-0086], [RFC-0087] |
| | – | FIDL text format | Unpublished |
| | [RFC-0059] | Reserved bits in vector, string, and array count fields | Implemented; reserved bits no longer used by LLCPP |
| | [RFC-0017] | The FTP Process is dead, long live the RFC Process! | Implemented |
| | – | FIDL Large message support | [Withdrawn][large-message-cl]; Superseded by [RFC-0196] |
| | [RFC-0076] | FIDL API summaries | Implemented |
| | [RFC-0083] | FIDL versioning | [Implementation in progress](https://fxbug.dev/42146818) |
| | [RFC-0086] | Updates to RFC-0050: FIDL attributes syntax | Implemented |
| | [RFC-0088] | Updates to RFC-0050: FIDL bits, enum, and constraints syntax | Rejected |
| | [RFC-0087] | Updates to RFC-0050: FIDL method parameter syntax | [Implementation in progress](https://fxbug.dev/42156243) |
| | [RFC-0097] | FIDL Toolchain | [Implementation in progress](https://fxbug.dev/42115264) |
| | [RFC-0113] | Efficient envelopes | Implemented |
| | [RFC-0114] | Inlining small values in FIDL envelopes | Implemented |
| | [RFC-0116] | Wire format support for sparser FIDL tables | Rejected |
| | [RFC-0120] | Standalone use of the FIDL wire format | [Implementation in progress](https://fxbug.dev/42121756) |
| | [RFC-0131] | Design principles of the FIDL wire format | Implemented |
| | [RFC-0132] | FIDL table size limit | [Implemented](https://fuchsia-review.googlesource.com/c/fuchsia/+/583988) |
| | [RFC-0137] | Discard unknown data in FIDL | [Implementation in progress](https://fxbug.dev/42166276) |
| | [RFC-0138] | Handling unknown interactions | [Implementation in progress](https://fxbug.dev/42169590) |
| | [RFC-0149] | FIDL encode validation not mandatory | Implemented |
| | [RFC-0160] | Remove support for FIDL struct defaults | Implemented |
| | [RFC-0190] | FIDL support for syscalls | [Implementation in progress](https://fxbug.dev/42061412) |
| | [RFC-0196] | FIDL large messages | [Implementation in progress](https://fxbug.dev/42051196) |
| | – | A JSON representation for FIDL | [In review](https://fuchsia-review.googlesource.com/c/fuchsia/+/688226) |
| | – | FIDL complex constants | [In review](https://fuchsia-review.googlesource.com/c/fuchsia/+/690449) |
| | – | FIDL language support plans | [In review](https://fuchsia-review.googlesource.com/c/fuchsia/+/705622) |
| | – | Terminal events | [In review](https://fuchsia-review.googlesource.com/c/fuchsia/+/632266/) |
| |
| <!-- link labels --> |
| [rfcs]: /docs/contribute/governance/rfcs/README.md#proposals |
| [ftps]: /docs/contribute/governance/deprecated-ftp-process.md |
| [protobuf-self-describe]: https://developers.google.com/protocol-buffers/docs/techniques#self-description |
| [measure-tape]: /tools/fidl/measure-tape/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_separating_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 |
| [rfc-0088]: /docs/contribute/governance/rfcs/0088_rfc_0050_bits_enums_constraints.md |
| [rfc-0097]: /docs/contribute/governance/rfcs/0097_fidl_toolchain.md |
| [rfc-0113]: /docs/contribute/governance/rfcs/0113_efficient_envelopes.md |
| [rfc-0114]: /docs/contribute/governance/rfcs/0114_fidl_envelope_inlining.md |
| [rfc-0116]: /docs/contribute/governance/rfcs/0116_fidl_sparser_tables.md |
| [rfc-0120]: /docs/contribute/governance/rfcs/0120_standalone_use_of_fidl_wire_format.md |
| [rfc-0131]: /docs/contribute/governance/rfcs/0131_fidl_wire_format_principles.md |
| [rfc-0132]: /docs/contribute/governance/rfcs/0132_fidl_table_size_limit.md |
| [rfc-0137]: /docs/contribute/governance/rfcs/0137_discard_unknown_data_in_fidl.md |
| [rfc-0138]: /docs/contribute/governance/rfcs/0138_handling_unknown_interactions.md |
| [rfc-0149]: /docs/contribute/governance/rfcs/0149_fidl_encode_validation_not_mandatory.md |
| [rfc-0160]: /docs/contribute/governance/rfcs/0160_fidl_remove_struct_defaults.md |
| [rfc-0190]: /docs/contribute/governance/rfcs/0190_fidl_support_for_syscalls.md |
| [rfc-0196]: /docs/contribute/governance/rfcs/0196_fidl_large_messages.md |