After importing pf.Task (using basic-cli as the platform - "https://github.com/roc-lang/basic-cli/releases/download/0.3.2/tE4xS_zLdmmxmHwHih9kHWQ7fsXtJr7W7h3425-eZFk.tar.br"), if I try to use Task.ok I get the following error:
── NOT EXPOSED ────────────────────────────────────────────────────── main.roc ─
The Task module does not expose `ok`:
30│ Task.ok {}
^^^^^^^
Did you mean one of these?
Task.map
Task.loop
Task.fail
Task.await
────────────────────────────────────────────────────────────────────────────────
1 error and 0 warnings found in 12 ms.
You can run the program anyway with roc run
Running the program produces the following crash error:
Roc crashed with:
ValueNotExposed { module_name: ModuleName(IdentStr { string: "Task" }), ident: Ident(IdentStr { string: "ok" }), region: @567-574, exposed_values: ['await', 'succeed', 'fail', 'map', 'mapFail', 'onFail', 'attempt', 'forever', 'loop', 'fromResult'] }
Here is the call stack that led to the crash:
shm.open
/home/runner/work/roc/roc/basic-cli/src/src/lib.rs
Optimizations can make this list inaccurate! If it looks wrong, try running without `--optimize` and with `--linker=legacy`
After looking at the source code I cannot see why Task.ok would not be exposed, unless the platform release is on a version that didn't use to expose it?
If I try to do an unqualified import pf.Task.{ ok }, the error it produces is different:
── UNRECOGNIZED NAME ──────────────────────────────────────────────── main.roc ─
The Task module does not expose anything by the name ok.
── DUPLICATE NAME ─ ....2/tE4xS_zLdmmxmHwHih9kHWQ7fsXtJr7W7h3425-eZFk/Task.roc ─
The ok name is first defined here:
37│ succeed = \ok -> InternalTask.succeed ok
^^
But then it's defined a second time here:
48│ Ok ok -> transform (Ok ok) |> InternalTask.toEffect
^^
Since these variables have the same name, it's easy to use the wrong
one by accident. Give one of them a new name.
── DUPLICATE NAME ─ ....2/tE4xS_zLdmmxmHwHih9kHWQ7fsXtJr7W7h3425-eZFk/Task.roc ─
The ok name is first defined here:
37│ succeed = \ok -> InternalTask.succeed ok
^^
But then it's defined a second time here:
81│ Ok ok -> Task.succeed (transform ok) |> InternalTask.toEffect
^^
Since these variables have the same name, it's easy to use the wrong
one by accident. Give one of them a new name.
── DUPLICATE NAME ─ ....2/tE4xS_zLdmmxmHwHih9kHWQ7fsXtJr7W7h3425-eZFk/Task.roc ─
The ok name is first defined here:
37│ succeed = \ok -> InternalTask.succeed ok
^^
But then it's defined a second time here:
92│ Ok ok -> Task.succeed ok |> InternalTask.toEffect
^^
Since these variables have the same name, it's easy to use the wrong
one by accident. Give one of them a new name.
── DUPLICATE NAME ─ ....2/tE4xS_zLdmmxmHwHih9kHWQ7fsXtJr7W7h3425-eZFk/Task.roc ─
The ok name is first defined here:
37│ succeed = \ok -> InternalTask.succeed ok
^^
But then it's defined a second time here:
101│ Ok ok -> succeed ok
^^
Since these variables have the same name, it's easy to use the wrong
one by accident. Give one of them a new name.
── UNRECOGNIZED NAME ─ ...tE4xS_zLdmmxmHwHih9kHWQ7fsXtJr7W7h3425-eZFk/Task.roc ─
The Task module does not expose anything by the name ok.
── UNRECOGNIZED NAME ─ ...tE4xS_zLdmmxmHwHih9kHWQ7fsXtJr7W7h3425-eZFk/Task.roc ─
The Task module does not expose anything by the name ok.
── UNRECOGNIZED NAME ─ ...tE4xS_zLdmmxmHwHih9kHWQ7fsXtJr7W7h3425-eZFk/Task.roc ─
The Task module does not expose anything by the name ok.
── UNRECOGNIZED NAME ─ ...tE4xS_zLdmmxmHwHih9kHWQ7fsXtJr7W7h3425-eZFk/Task.roc ─
The Task module does not expose anything by the name ok.
── UNRECOGNIZED NAME ─ ...tE4xS_zLdmmxmHwHih9kHWQ7fsXtJr7W7h3425-eZFk/Task.roc ─
The Task module does not expose anything by the name ok.
── UNRECOGNIZED NAME ─ ...tE4xS_zLdmmxmHwHih9kHWQ7fsXtJr7W7h3425-eZFk/Task.roc ─
The Task module does not expose anything by the name ok.
── UNRECOGNIZED NAME ─ ...tE4xS_zLdmmxmHwHih9kHWQ7fsXtJr7W7h3425-eZFk/Task.roc ─
The Task module does not expose anything by the name ok.
── UNRECOGNIZED NAME ─ ...tE4xS_zLdmmxmHwHih9kHWQ7fsXtJr7W7h3425-eZFk/Task.roc ─
The Task module does not expose anything by the name ok.
── UNRECOGNIZED NAME ─ ...tE4xS_zLdmmxmHwHih9kHWQ7fsXtJr7W7h3425-eZFk/Task.roc ─
The Task module does not expose anything by the name ok.
── UNRECOGNIZED NAME ─ ...tE4xS_zLdmmxmHwHih9kHWQ7fsXtJr7W7h3425-eZFk/Task.roc ─
The Task module does not expose anything by the name ok.
── UNRECOGNIZED NAME ─ ...tE4xS_zLdmmxmHwHih9kHWQ7fsXtJr7W7h3425-eZFk/Task.roc ─
The Task module does not expose anything by the name ok.
────────────────────────────────────────────────────────────────────────────────
16 errors and 0 warnings found in 15 ms.
You can run the program anyway with roc run
Task.ok was created after that release. It was renamed from Task.succeed, so using that should work. There is an unstable 4.0 release, or you could clone the repository and use a local platform as well with pf: "./path/to/basic-cli/src/main.roc
Thank you!
It might be wise to have the documentation reflect the latest release, instead of the current git version
Oh wow, docs for basic-cli are back up and running, awesome. :tada:
@Anton is it easy enough to have docs build from the latest release? I guess if someone is using source they can generate docs locally.
I'll set up docs for 0.3.2, 0.4.0 and the latest git version
@Noa Vidović documentation for basic-cli 0.3.2 is available now: https://www.roc-lang.org/packages/basic-cli/0.3.2
Last updated: Dec 21 2025 at 12:15 UTC