> ## Documentation Index
> Fetch the complete documentation index at: https://docs.siftstack.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Troubleshooting

> Learn how to fix common configuration issues.

## Overview

This guide covers the common issues users encounter and provides steps to resolve them quickly.

If your issue is not listed here, please contact support with details about your browser, operating system, and the steps taken before the issue occurred.

To contact support in Sift, click your profile, and then click **Customer Support**.

<Note>
  If the issue occured during a Run, include a sharelink of the Run or Asset/Run ID.
</Note>

## Plot and visualization issues

These are the most common types of issues and are typically related to rendering, zooming, or large datasets.

### Zoom does not work (X or XY zoom is unresponsive)

<Tabs>
  <Tab title="Cause">
    This usually happens when:

    * The dataset being plotted is very large
    * The plot has not fully finished loading
    * The browser is temporarily overloaded
    * FFT or high-resolution rendering is enabled

    In some cases, the browser tab might appear frozen while processing data.
  </Tab>

  <Tab title="Fix">
    1. Wait 10–15 seconds to allow the plot to fully load.
    2. Refresh the browser tab.
    3. Reduce the time range being plotted.
    4. Plot fewer Channels at once.
    5. Disable FFT (if enabled).
    6. Close other heavy browser tabs and try again.

    If the issue persists, provide support with:

    * Browser and OS version
    * Time range plotted
    * Number of Channels
    * Whether FFT was enabled
  </Tab>
</Tabs>

### Plot freezes or browser tab locks up

<Tabs>
  <Tab title="Cause">
    This typically occurs when:

    * Plotting a very large time range
    * Viewing high-sample-rate data
    * Plotting many Channels simultaneously
    * Rendering FFT on large datasets
    * The browser might become temporarily unresponsive while processing.
  </Tab>

  <Tab title="Fix">
    1. Refresh the page.
    2. Reduce the plotted time range.
    3. Plot fewer Channels.
    4. Disable FFT (if enabled).
    5. Try a different browser to confirm whether the issue is browser-specific.
       If reproducible, share the exact plot configuration or link with support.
  </Tab>
</Tabs>

### Error after removing a Channel from a plot

<Tabs>
  <Tab title="Cause">
    This might occur when:

    * A removed Channel is still referenced in the plot state
    * A shared link contains outdated Channel references
    * A rendering state mismatch occurs after dynamic updates
  </Tab>

  <Tab title="Fix">
    1. Refresh the page.
    2. Re-add the Channel and then remove it again.
    3. Recreate the plot from scratch.
    4. If using a shared link, regenerate the link.
    5. Clear browser cache and retry.
       If the error continues, provide a share link and reproduction steps to support.
  </Tab>
</Tabs>

### Annotations obscure plotted data

<Tabs>
  <Tab title="Cause">
    Annotations might render above data layers, which can cause labels or markers to visually block parts of the timeseries.
  </Tab>

  <Tab title="Fix">
    1. Toggle annotation visibility off (if available).
    2. Zoom in to reduce visual overlap.
    3. Reduce annotation density where possible.
    4. Capture a screenshot and report if this significantly affects usability.
  </Tab>
</Tabs>

### Metadata box values appear swapped or incorrect

<Tabs>
  <Tab title="Cause">
    In rare cases, the UI rendering state might temporarily mismatch labels and values, particularly after zooming or rapid interactions.
  </Tab>

  <Tab title="Fix">
    1. Zoom slightly in or out.
    2. Refresh the page.
    3. Reopen the plot in a new tab.
    4. Clear browser cache if the issue persists.
       If the issue consistently reproduces, report with:

    * Screenshot
    * Browser version
    * Plot configuration
  </Tab>
</Tabs>

## Channel and layout issues

### Long Channel names overlap or break layout

<Tabs>
  <Tab title="Cause">
    Very long Channel names might exceed the available UI width, leading to:

    * Overlapping text
    * Truncated names
    * Misaligned layout elements
  </Tab>

  <Tab title="Fix">
    1. Resize your browser window.
    2. Hover over truncated names to view the full Channel name (if tooltip is available).
    3. Rename Channels to shorter aliases (if appropriate).
    4. Report cases where the layout breaks completely.

    <Note>
      See Asset [naming conventions](/documentation/ingest/stream/organize-streamed-data-into-assets-and-runs#naming-conventions) and [Channel naming restrictions](/documentation/reference/channels-reference#naming-restrictions).
    </Note>
  </Tab>
</Tabs>

### Channel labels appear duplicated or formatted incorrectly

<Tabs>
  <Tab title="Cause">
    This might occur when:

    * Channel metadata includes overlapping naming attributes
    * Asset or Run information is appended multiple times
    * A UI formatting issue is triggered
  </Tab>

  <Tab title="Fix">
    1. Refresh the page.
    2. Remove and re-add the Channel.
    3. Verify the Channel's metadata configuration.
    4. If persistent, provide the Channel name and Asset details to support.
  </Tab>
</Tabs>

## Rule configuration issues

### Rule shows "Error" instead of "Failure"

<Tabs>
  <Tab title="Cause">
    This occurs when the Rule itself is misconfigured, rather than the data violating a correctly written Rule.

    <Note>
      * Rules are written as CEL expressions. When Rule logic is discussed in this section, it is referring to CEL expression validity. See [Rules overview](/documentation/review/detect-deviations-automatically-using-rules).
      * See [live Rule limitations](/documentation/review/detect-deviations-automatically-using-rules#live-rules-limitations).
    </Note>

    There are two distinct outcomes when a Rule Runs:

    * **Failure**: The Rule logic is valid, but the data violates it.
    * **Error**: The Rule configuration is invalid or cannot execute properly.

    An error state is typically caused by:

    * Invalid or incomplete Rule logic
    * Incorrect threshold expressions
    * Referencing fields or Channels that do not exist
    * Invalid arguments in Rule conditions
    * Unsupported comparison types

    In these cases, the system cannot properly evaluate the Rule, so it enters an error state rather than reporting a failure.
  </Tab>

  <Tab title="Fix">
    1. Review the Rule configuration carefully.
    2. Confirm all referenced Channels or fields exist and are spelled correctly.
    3. Verify thresholds and comparison operators are valid.
    4. Ensure the Rule logic matches the intended data type (numeric vs boolean vs string).
    5. Save the Rule and test it on a small, known dataset.
    6. If the error persists, copy the error message and provide:
       * Rule configuration
       * Asset or Run used
  </Tab>
</Tabs>

### Rule never evaluates or shows no results

If a Rule appears to never run, or produces no failures or results, it is often due to configuration scope rather than a system issue.

Common causes include:

* The Rule is attached to the wrong Asset
* No data exists in the selected time range
* The Rule is scoped to Runs that do not contain matching data
* Filters or conditions prevent the Rule from executing
* The Rule is not enabled or not associated with an active evaluation context

### Rule errors when a Run is missing a referenced Channel

<Tabs>
  <Tab title="Cause">
    Sift requires every Channel referenced in a Rule to exist on the Run being evaluated. If a Channel only reports data under certain conditions, such as a mode that is not always active, Runs where that Channel never reports have no Channel to reference, and the Rule cannot evaluate.
  </Tab>

  <Tab title="Fix">
    Split the logic into two Rules:

    1. A general Rule that does not reference the conditional Channel, so it evaluates on every Run.
    2. A Rule that adds the conditional Channel as an extra input, so it only evaluates on Runs where that Channel is present.

    Run both Rules via a Report. On Runs where the conditional Channel is absent, the second Rule shows a per-Rule error; this is expected, not a failure of the first Rule.

    <Note>
      Preview the two Rules one at a time. Previewing both together against a Run that is missing the conditional Channel can hide the other Rule's result in the Preview panel.
    </Note>
  </Tab>
</Tabs>

## Python client (sift-stack-py) issues

### Import fails in a PyInstaller windowed EXE

<Tabs>
  <Tab title="Cause">
    When `sift-stack-py` is imported inside a PyInstaller windowed build (compiled with `--noconsole` or `--windowed`), the process has no attached console, so Python sets `sys.stdout` and `sys.stderr` to `None`. An internal dependency used by `sift-stack-py` attempts to write to these streams on import and raises an error before any Sift code runs.

    This affects all `sift-stack-py` versions prior to the fix released in response to this issue.
  </Tab>

  <Tab title="Fix">
    **Recommended**: Upgrade to the latest version of `sift-stack-py`, which handles `None` streams internally.

    ```bash theme={null}
    pip install --upgrade sift-stack-py
    ```

    **Workaround for older versions**: Add the following snippet at the top of your entry-point module, before any `sift-stack-py` import:

    ```python theme={null}
    import sys
    import os

    if sys.stdout is None:
        sys.stdout = open(os.devnull, "w", encoding="utf-8")
    if sys.stderr is None:
        sys.stderr = open(os.devnull, "w", encoding="utf-8")
    ```

    This redirects the missing streams to `/dev/null` so the dependency initializes without error. Place this code before any `from sift...` or `import sift` statements.
  </Tab>
</Tabs>

## File import issues

### Import fails with gRPC RESOURCE\_EXHAUSTED error

<Tabs>
  <Tab title="Cause">
    This error occurs when importing a Parquet file that contains a large number of Channels. The import configuration Sift generates for the file can exceed the 10 MiB gRPC message size limit even when the data file itself is smaller than that threshold.

    ```
    StatusCode.RESOURCE_EXHAUSTED
    grpc: received message larger than max (X vs. 10485760)
    ```

    The error is thrown by the [CreateDataImportFromUpload](/api-reference/dataimportservice/createdataimportfromupload#createdataimportfromupload) endpoint. The configuration size scales with the number of Channels defined in the file, not the volume of data.
  </Tab>

  <Tab title="Fix">
    Split the Parquet file into multiple smaller files, each containing a subset of the Channels, then import each file separately targeting the same Asset and Run.

    For example, if your file contains 500 channels:

    1. Create **File A** with channels 1–250.
    2. Create **File B** with channels 251–500.
    3. Import File A and File B as separate imports, both mapped to the same Asset and Run.

    Sift is working on increasing the gRPC message size limit to accommodate files with large channel counts in a future release.
  </Tab>
</Tabs>
