When something goes wrong, EmbodiFlow tries to tell you exactly where. A problem in main.py is marked with its line and column; a problem in a workflow names the step and the field. Every error also has a code, and this page explains each one. The text below is generated from the same copy the console, the CLI and the MCP tools show, so it always matches what you see.
Reading a run
A step ends as succeeded, failed, not applicable or skipped. Only succeeded is green; not applicable and skipped steps are grey. A failed step shows <code>: <message>, with the traceback in the log.
A skipped step always says why: the condition was false, an upstream step failed, a stopping check stopped the recording, the step had no episodes, or it was a test run on a window, which saves no result.
Check results work the same way. A result is pass, warn, fail, error, not_evaluated or not_applicable, and only pass is green.
Error codes
ALGORITHM_CATEGORY_INVALID: Unknown algorithm category
Cause. The decorator or algorithm.yaml names a category that does not exist.
What to do. Use one of standardize, check, transform, enrich, segment, curate or export.
ALGORITHM_INTERFACE_CHANGED: The interface changed: save a major version
Cause. Ports, level, requires, declared features, checks or labels, or a param type changed. Workflows that use the current major version would break.
What to do. Save the proposed major version. Workflows keep using the old major version until you switch them.
ALGORITHM_MANIFEST_DRIFT: The code no longer matches the saved interface
Cause. The decorator in main.py describes a different interface from the one frozen when this version was saved, so the step did not start.
What to do. Save the algorithm again so the interface is extracted from the current code.
FEATURE_ROW_COUNT_MISMATCH: Per-frame values do not cover every frame
Cause. A per-frame feature has a different number of rows from the frames of the recording.
What to do. Write one row per frame. Use NaN or -1 for frames without a value.
FEATURE_TYPE_UNKNOWN: Unknown feature type
Cause. A feature, label or input requirement names a semantic type that is not in the registry.
What to do. Use a type from the registry, such as scalar, vector, pose.se3 or json.
EPISODES_INVALID: Episodes are not valid
Cause. An episode is empty, lies outside the recording, overlaps another episode or has an undeclared label.
What to do. Write non-overlapping ranges inside the recording and declare every label key.
EPISODES_INPUT_MISSING: No episode list from the previous step
Cause. The step that proposes episodes finished without storing an episode list, so this step has nothing to run on.
What to do. Run the whole workflow again without reusing earlier results, or check that the episode step succeeded.
SELECTION_INVALID: Curate decisions are not valid
Cause. A decision names an episode outside the source version, decides one episode twice, drops an episode without a reason or has a wrong summary.
What to do. Decide each episode of the source version at most once and give every dropped episode a reason.
CURATE_SELECTION_CONFLICT: Two curate steps decide the same thing
Cause. More than one curate step sets splits, or more than one sets task texts, so the new version would depend on their order.
What to do. Let one curate step decide splits and one decide task texts.
WORKFLOW_CONTENT_MISSING: The connection lacks what the input needs
Cause. The input requires a feature type that the connected output does not declare.
What to do. Connect an output that declares the required type, or add a step that produces it.
WORKFLOW_NO_STANDARDIZE: The workflow has no standardize step
Cause. The recording saved by a processing workflow must come from exactly one standardize step.
What to do. Add a standardize step (or uses: auto) and connect its recording towards the Output node.
WORKFLOW_EPISODES_MISMATCH: Per-episode values would attach to other episodes
Cause. An episode-level step reads episodes from a different producer than the episodes the Output node saves.
What to do. Connect the step and the Output node to the same episodes output.
WORKFLOW_PRIVACY_BARRIER: Pixels would be read before anonymization
Cause. A step or the Output node reads the recording on a path that does not pass through the anonymize step. Recordings that require privacy may be read only after it.
What to do. Connect the step to the output of the anonymize step instead.
WORKFLOW_STOPPED_BY_CHECK: Stopped by a check
Cause. A check set to stop on failure failed, so the remaining steps did not run and nothing was saved for this recording.
What to do. Open the check result to see why it failed. Fix the data or change the check to continue, then run the workflow again.
OUTPUT_ERROR: The algorithm wrote an invalid output
Cause. An output breaks its contract: a name that was not declared, a wrong shape or type, or a missing file.
What to do. Read the step message for the field that is wrong, fix the code and test it on a sample.
EXPORT_ARTIFACT_EMPTY: The export wrote no files
Cause. An export step must write at least one file. The platform packages the files into export.zip for download and training.
What to do. Write at least one file with the ArtifactWriter (out.path or out.add); an image writes under /embodiflow/output/<port>/. Test it on a sample.
EXPORT_PACKAGE_MISSING: The platform did not package the export
Cause. The export step wrote files, but no export.zip reached the platform. The platform builds it when the step ends, so its step image is out of date or failed.
What to do. Run the export again. If it fails the same way, ask the platform operator to update the flow-io image.
WORKFLOW_COMMIT_FAILED: The platform could not save the step outputs
Cause. The step finished and wrote its outputs, but the platform failed while recording them. The fault is on the platform side, not in the step or its input.
What to do. Run the workflow again. If it fails the same way, send the run ID to the platform operator.
OUTPUT_FILE_NOT_REGULAR: An output is a link, not a file
Cause. The step left a symbolic link or another entry that is not a regular file in its outputs. The platform never follows links, so nothing was saved.
What to do. Copy the file into the output folder instead of linking to it, then run the step again.
CURATE_NOTHING_KEPT: Every episode was dropped
Cause. The curate decisions drop every episode of the source version, so there is nothing to put in a new version. The step message counts each drop reason; quality: not_evaluated means some enabled checks did not run.
What to do. Loosen the curate settings so at least one episode stays, or finish the missing checks, then run the workflow again.
CURATE_SOURCE_VERSION_UNUSABLE: The source version cannot be curated
Cause. The source dataset version was redacted or has no data contract digest.
What to do. Run the curate workflow on a version that was not redacted, or create a new version first.
CURATE_TASK_CHANGE_UNSUPPORTED: Curate cannot change task texts yet
Cause. A curate step sets a task text for a kept episode, and a version keeps each episode task as frozen.
What to do. Remove the task decision from the curate step, or edit the episode task and create a new version.
CURATE_RUN_UNREADABLE: The curate run cannot be read
Cause. The run has no readable workflow snapshot or source version, or the team has no active storage.
What to do. Start the curate workflow again from the version page; contact support if it repeats.
ALGORITHM_FILE_INVALID: The algorithm does not meet the rules
Cause. The interface in main.py (or the algorithm.yaml of the image) breaks a rule. The message names the line or field.
What to do. Fix the line the message names. Decorator arguments and param defaults must be plain values, not computed ones.
ALGORITHM_GPU_UNSATISFIABLE: No GPU fits this algorithm
Cause. The algorithm asks for more GPU memory than any compute pool of this platform offers.
What to do. Ask for less GPU memory in resources, or ask your admin about a larger GPU class.
ALGORITHM_PARAM_INVALID: A parameter value does not fit
Cause. A value is not a declared parameter, has the wrong type, or is outside its limits.
What to do. Use the declared names, types and limits shown for each parameter, or omit the value to use its default.
ALGORITHM_SAMPLE_RUN_INPUT_INVALID: The sample does not fit this algorithm
Cause. The chosen input is not what the algorithm reads: a recording, an episode or a dataset version, or the window is not allowed.
What to do. Choose a recording for recording-level algorithms, an episode for episode-level ones and a dataset version for curate and export.
RECORDING_SCHEMA_NOT_READY: The recording has no processed result yet
Cause. The recording has not finished processing, so its cameras, columns and features are not known yet.
What to do. Wait for processing to finish, or choose another recording.
SAMPLE_PREVIEW_INVALID: The sample ran, but its preview is missing
Cause. The preview the run produced was too large or not valid, so it was dropped. The result of the run is unchanged.
What to do. Run the sample again on a shorter window. If it keeps happening, report it.