Helix Core is now P4. Product user interfaces will be updated soon. Learn more >>

P4 CLI Documentation | 2026.1

# Stream types

In the stream spec, you assign stream types in a stream hierarchy The set of parent-to-child relationships between streams in a stream depot. according to the expected usage, stability, and Flow rules of the stream.

Type | Description
--- | ---
release | A stream that is more stable than its parent. Expects merging down from more stable child streams. Does not expect copying up from its parent stream. Useful for ongoing stabilization, bug fixing, and release maintenance.
mainline | A stream with no parent. Expects merging down from more stable child streams. Expects copying up from less stable child streams. The `mainline` stream is typically the parent of the `release`, `sparserel`, `development`, and `sparsedev` streams.
development | A `development` stream is less stable than its parent. Expects merging down from its parent stream. Expects copying up from its less stable child streams. Does not expect to have more stable child streams. Useful for long-term projects and developing major new features.
sparsedev sparserel | Sparse streams are lightweight: no need to wait a long time for the initial populate command, and no need to delete or unload to maintain performance. In terms of flow rules : `sparsedev` is similar to `development` `sparserel` is similar to `release` You can convert a `sparsedev` stream to `development`, and a `sparserel` stream to `release`. To learn more, see Sparse streams.
task | Consider using sparse streams instead of task streams because sparse streams have significant advantages over task streams. Use sparse streams instead of `task` streams unless you need a feature that sparse streams do not support. Task streams should be temporary. After you integrate the changes in task streams, you should Delete, unload, or convert the task stream. Otherwise database metadata accumulation can affect performance. To convert an existing `task` stream to a `development` stream, see Convert a task stream to a development stream.
virtual | Restricts the workspace view of a real stream. Virtual streams act as a filter. They are useful when you want to: Submit changes directly to a stream, but do not want to sync all of the files in the stream view to your workspace. Develop against the same stream but switch imported libraries, such as when you develop across multiple platforms See Virtual streams.

In this section:

Your search for returned results