## TL;DR
Notebooks freely import `IPython.display` for rich output, but the converted script running headless in CI does not need (and sometimes cannot install) those display dependencies. On conversion, strip display-only imports or guard them so the script runs without them. Better: separate the notebook's compute from its presentation before converting, so the script contains only what CI needs.

```text
agent's converted script failed in CI with a missing display dependency error
```

## Use this when
- A notebook-converted script fails in CI importing display helpers.
- The notebook runs fine interactively.
- CI is headless/minimal by design.

## Not for this skill when
- The script fails on real logic imports (pandas, numpy). Install those.
- The notebook itself fails in CI. That is an env problem.

## Steps
1. Find the display imports in the converted script. Verify: you know which lines CI chokes on.
2. Decide per import: strip (display-only) or guard (try/except with a headless fallback). Verify: the script has no hard display dependency.
3. Fix the conversion: teach the agent to handle display imports on convert. Verify: fresh conversions are CI-clean.
4. Run the script in a CI-like container locally. Verify: it passes without display packages.
5. Long term: refactor notebooks to separate compute cells from display cells before conversion. Verify: the script is pure compute.

## Variant phrasings
### converted script display import CI
Short form. Strip or guard display imports.

### nbconvert script fails CI ipython display
The stack phrasing. Headless has no display.

### notebook to script CI missing dependency
General phrasing. Convert for CI, not for the notebook.

Compatibility: nbconvert script exporter, any CI. The headless constraint is environmental.

## Why it happens
The notebook UI makes display imports feel free: `from IPython.display import HTML` works everywhere Jupyter runs. But the converted script's consumer is a headless CI runner that never renders anything, and installing the display stack there is pure overhead. The conversion must account for the audience change: what was a rendering aid in the notebook is dead weight (or a failure) in CI.

## Edge cases / pitfalls
- Guarding with try/except hides real import errors too. Prefer stripping known display-only imports.
- Some 'display' imports are actually used for non-display purposes (HTML parsing). Check usage before stripping.
- The CI env should still install the real deps. Only the display-only ones get stripped.
- Test the converted script in CI on every notebook change. Conversion drift is silent.

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst_qUbu8jCiaN3yK1MPbm-v3A
