This issue proposes that WASI adopt the Component Model's fixed-length list feature (gated as 🔧 in the Component Model's gated features), following the process described in CONTRIBUTING.md § Adopting Component Model features.
Feature
The 🔧 gate covers the optional length immediate on the list type constructor: list<T, N> (WIT.md § Types, Explainer § Type Definitions). A fixed-length list has the low-level memory representation of a homogeneous tuple of the same length. The elements are stored inline, with no pointer/length indirection while keeping the dynamic indexing and source-level bindings of a list. The length must be greater than 0.
get-ipv4-address: func() -> list<u8, 4>;
This gives interfaces a natural way to express fixed-size data like addresses, digests, coordinates, matrices. Today these must be spelled as wide tuples (e.g. tuple<u16, u16, u16, u16, u16, u16, u16, u16> for an IPv6 address) or as dynamically-sized list<u8> with out-of-band length invariants.
Unlike some WIT-level features, fixed-length lists specialize the canonical ABI representation, so adopting 🔧 requires support in runtimes and bindings generators, not just WIT tooling.
Stability
Iteration and feedback
This feature was designed nearly two years between the spec merge and this proposal with design refinements driven by implementation feedback throughout:
wit-bindgen-core defines dedicated ABI instructions FixedLengthListLift/FixedLengthListLower/FixedLengthListLowerToMemory/ FixedLengthListLiftFromMemory (crates/core/src/abi.rs:337-361) and dispatches type declarations via TypeDefKind::FixedLengthList(t, size) (crates/core/src/lib.rs:205,245).
WASI APIs that would depend on it
Fixed-size data appears throughout WASI's API surface, and proposals in the pipeline would use list<T, N> in newly added or newly stabilized APIs:
- wasi-sockets — IP addresses, today spelled as wide tuples
(tuple<u8, u8, u8, u8> for IPv4, tuple<u16, ...> ×8 for IPv6)
- [wasi-webgpu] — vectors and matrices
- Embedded-focused proposals (wasi-i2c, wasi-spi, wasi-usb) — fixed-size registers and buffers
Adopting 🔧 does not change any already-released wasi:* API: existing stable signatures keep their current types. It makes list<T, N> available to stable (@since-gated) APIs from the adopting release onward, and part of the baseline that runtimes and toolchains must support for that release.
Requested action
Per CONTRIBUTING.md § Adopting Component Model features, we believe the stability criteria are met: the design is complete, and the feature has been through an extended phase of iteration and feedback across the spec, WIT tooling, and runtime implementations.
We therefore aim to add a vote to an upcoming WASI Subgroup meeting agenda to adopt Component Model fixed-length lists (🔧) for inclusion in the next WASI 0.3.x release. Once adopted:
This issue proposes that WASI adopt the Component Model's fixed-length list feature (gated as 🔧 in the Component Model's gated features), following the process described in CONTRIBUTING.md § Adopting Component Model features.
Feature
The 🔧 gate covers the optional length immediate on the
listtype constructor:list<T, N>(WIT.md § Types, Explainer § Type Definitions). A fixed-length list has the low-level memory representation of a homogeneoustupleof the same length. The elements are stored inline, with no pointer/length indirection while keeping the dynamic indexing and source-level bindings of a list. The length must be greater than 0.This gives interfaces a natural way to express fixed-size data like addresses, digests, coordinates, matrices. Today these must be spelled as wide tuples (e.g.
tuple<u16, u16, u16, u16, u16, u16, u16, u16>for an IPv6 address) or as dynamically-sizedlist<u8>with out-of-band length invariants.Unlike some WIT-level features, fixed-length lists specialize the canonical ABI representation, so adopting 🔧 requires support in runtimes and bindings generators, not just WIT tooling.
Stability
Iteration and feedback
This feature was designed nearly two years between the spec merge and this proposal with design refinements driven by implementation feedback throughout:
listin Add optional fixed length to lists component-model#384 (2024-09); the non-empty requirement was clarified from implementation feedback in Document fixed-size-lists must be non-empty component-model#504 (2025-04).Valrepresentation, canonical ABI lifting/lowering) in Fixed-length lists, host side bytecodealliance/wasmtime#12315 (merged 2026-07-07).wit-bindgen-coredefines dedicated ABI instructionsFixedLengthListLift/FixedLengthListLower/FixedLengthListLowerToMemory/FixedLengthListLiftFromMemory(crates/core/src/abi.rs:337-361) and dispatches type declarations viaTypeDefKind::FixedLengthList(t, size)(crates/core/src/lib.rs:205,245).WASI APIs that would depend on it
Fixed-size data appears throughout WASI's API surface, and proposals in the pipeline would use
list<T, N>in newly added or newly stabilized APIs:(
tuple<u8, u8, u8, u8>for IPv4,tuple<u16, ...>×8 for IPv6)Adopting 🔧 does not change any already-released
wasi:*API: existing stable signatures keep their current types. It makeslist<T, N>available to stable (@since-gated) APIs from the adopting release onward, and part of the baseline that runtimes and toolchains must support for that release.Requested action
Per CONTRIBUTING.md § Adopting Component Model features, we believe the stability criteria are met: the design is complete, and the feature has been through an extended phase of iteration and feedback across the spec, WIT tooling, and runtime implementations.
We therefore aim to add a vote to an upcoming WASI Subgroup meeting agenda to adopt Component Model fixed-length lists (🔧) for inclusion in the next WASI 0.3.x release. Once adopted:
@since-gated) WASI APIs in the next release may depend on the feature.